解决Python将txt多行数据作为一个list元素读入问题

3,837 阅读4分钟
       近日在利用python爬取某购物网站用户评论并存入txt,后将txt文件读入python进行后续自然语言处理时,遇到一个问题,在说明问题之前,先回顾一下将txt文件数据读入python的几条语句:

读取txt文件语句回顾

1.read() / read([size]): 按照输入的size值,从文件当前位置起读取size个字节,若未预置size,则一次性读取整个文件内容。读取后在python内以字符串格式存储。如果需要对文件按行进行处理,则不可用该方法。

2.readline() :每次读取一行内容,返回的是一个字符串对象。以行扫描的形式读取速度慢,在行扫描读取时,类似于堆栈指针,读完一行之后指针向下,读取下一行(理解这点对后面解决问题很重要)。

3.readlines() :一次性读取整个文件内容,并按行返回到list,每一行作为list的一个元素存储,方便对list操作。


问题介绍

 部分爬取评论展示:

1.拍照效果:不错,很清楚,很清楚,清楚

2.性价比很高的一款机型,拍摄清晰,运行流畅。

3.外形外观:非常漂亮 

待机时间:长 

屏幕音效:很好 

拍照效果:不错

4.不错

5.外形外观:与图片无差异 

屏幕音效:挺好的 

拍照效果:跟介绍的功能一样 

运行速度:不玩游戏挺快的 在疫情期间,能够如此快速度收到请回复不愧是京东!

6.很喜欢,手感也很好。

    

       在对txt读取时,期望达到的效果是一个用户发表的评论作为一个list元素存储,如上显示了6条评论,其中由于评论本身的格式问题,第3条和第5条,本身为一个用户发表的1条评论,但在txt中保存时占了多行,所以利用readlines( )语句读取此种格式的评论时,会将一条完整的评论按行数划分成多个list元素,这显然不是我们想要的。

     初步想法是为每一个用户的评论结束后加入特定的结束标志。利用判断语句,如果能在此行读到结束标志,则说明此用户发表的只占一行,可以直接按行读取后,利用append( )语句不断添加到list。

      而如果在此行读不到结束标志,说明此用户发表的为占多行的评论,则需要对每一行进行保存:

      在此行读不到结束标志,保存此行,在下一行任然读不到结束标志,保存之前的行与此行,直到读到结束标志,把保存的所有行作为一个元素存入list。

      如何在readlines( )基础上用代码解决此种问题,我的解决方法要结合txt存和txt读。

存入txt时在一个用户的评论句尾添加“***”作为完结标志

import requests
import re
import json
import time
headers={    
    'Accept': '*/*',    
    'User_Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',    
    'Referer':'https://item.jd.com/100003884761.html'    
    }
url='https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100003884761&score=0&sortType=6&page=0&pageSize=10&isShadowSku=0&fold=1'
urls=['https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100003884761&score=0&sortType=6&page={}&pageSize=10&isShadowSku=0&fold=1'.format(str(i)) for i in range(0,100,1)]
def get_reviews(url,data=None):    
    time.sleep(2)    
    response=requests.get(url,headers=headers)    
    cont=response.text    
    rex=re.compile(r'\w+[(]{1}(.*)[)]{1}')    
    conten=rex.findall(cont)[0]    
    con=json.loads(conten)    
    news=con['comments']
#以上为我构造的动态爬虫
    with open('content.txt','a',encoding='utf-8') as f:
        for n in news:            
        info=n['content']+'***'+'\n'
#在将评论存入txt时,每一个用户评论后加入'***'作为结束标识,同时要加上换行符'\n',方便readline()语句的按行读取评论            
        f.write(info)

for single_url in urls:    
    get_reviews(single_url)


读取txt时识别“***”完结标志,利用判断语句判断某用户评论是否在此行完结

a=[]
b=str()
#首先创建一个空列表和空字符串
with open('micc9econtent2.txt','r',encoding='utf-8') as f:    
    lines=f.readlines()    
    for line in lines:
#构建循环一行一行读取txt内容        
        if '***' not in line:            
            b=b+line.split('\n')[0]
#如果此行读不到结束标志,把此行保存在字符串中(记得要去掉之前添加的分行符),读下一行如果仍读不到结束标志,将下一行与之前的行一起存入字符串                    
        else:            
            c=b+line            
            c=c.split('***')[0]            
            a.append(c)            
            b=''
#如果终于读到了结束标志,将带有结束标志的本行和之前保存的多行作为一个元素存入列表(记得要去掉之前添加的分行符和结束标志)
#还有一点要记得在读到结束标志后清除用来存储行而建立的字符串,以便下次存储    
    f.close()   
print(len(a))


以上就是全部内容,希望有帮助。