Python实现批量按顺序读取txt文本并保存到新文本txt中

 

目录

问题引入:

常见问题:

①文本顺序错误

解决方案:在os.lisdir()运行后的文件排序方法:

①文件名只由数字构成的排序方法:

②文件名中有数字以及其他符号的排序方法


问题引入

在下载一本小说或者代码说明时,往往是一章一章分开的,导致阅读繁琐,这时我们可以通过python来批量获取txt文本,然后再汇总保存到一个新的文本之中,方便后续查看。

 读取所有文本时,可能由于某些文本是'utf-8'的编码规则,某些文本是‘ANSI’编码规则,导致通过with open(path,'r',encoding='utf-8')的方法来读取时报错。

 UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 4: invalid start byte

 这时我们可以借助chardet库来获得其编码方式,从而解码,如果没有可以先进行安装

pip install chardet

 运行以下代码获得对应方式并进行相应的解码decode

import chardet
f = open(path,'rb')  #path为要打开的文本路径
r = f.read()
#获取文本的编码方式
f_charInfo = chardet.detect(r)
print(f_charInfo) #输出文本格式信息
print(f_charInfo['encoding']) #取得文本格式
print(r.decode(f_charInfo['encoding'])) #通过取得的文本格式读取txt

返回一个字典参数如下:{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}

encoding:表示字符编码方式。
confidence:表示可信度,也可以理解为检测的概率。
language:语言。 

 常见问题:

①文本顺序错误

在获取全文的过程中,需要先获取文件夹下的所有文件,但单纯通过os.listdir()来获取所有文件后,会发现顺序出现了问题,导致后续所有文本的顺序出错

 

错误如下图所示: 

 解决方案:在os.lisdir()运行后的文件排序方法:

①文件名只由数字构成的排序方法:

如图所示:

files.sort(key=lambda x:int(x.split(".")[0]))

通过lambda表达式,获取.txt后缀名之前的数字,然后以此来排序,从而获得正确的文件顺序

②文件名中有数字以及其他符号的排序方法

如图所示:

 可以看到我这里有“-”符号作为标识符,通过使用find()函数来获取其后面的数字,然后进行排序

files.sort(key=lambda x:int(x.split(".")[0][x.find('-')+1:]))

上面一行代码不懂的话,看这里代码拆分详解:

t1='Listing 1-71.txt' 
t2=t1.split(".")[0] #获取.前面的字符串
t3=t2[t1.find('-')+1:]  #获取之后通过find('-')获得其后面的数字
t3=int(t3) #最后转化为int类型进行排序

排序后的结果:

 最后将文本保存到新的文本中

    with open(itspath+'//'+itsname+'.txt','w') as f2:
        f2.write(txts)

 End~附上我的代码:

def read_all_txt(itspath,itsname):
    import os
    import chardet
    files= os.listdir(itspath) #得到文件夹下的所有文件名称
    files.sort(key=lambda x:int(x.split(".")[0][x.find('-')+1:]))
    txts = []
    for file in files: #遍历文件夹
        position = itspath+'\\'+ file #构造绝对路径,"\\",其中一个'\'为转义符
        print (position)
        file[file.find('-')+1:]
        try:
            f = open(position,'rb')
            r = f.read()
         #获取文本的编码方式
            f_charInfo = chardet.detect(r)
            print(f_charInfo) #输出文本格式信息
            print(f_charInfo['encoding']) #取得文本格式
            print(r.decode(f_charInfo['encoding'])) #通过取得的文本格式读取txt
            txts.append(r.decode(f_charInfo['encoding']))
            f.close()
        except:
          if f:
            f.close()
            print('err')
           # txts.append(data)
    txts = ','.join(txts) #将列表变成字符串
    #最后保存到文本中
    with open(itspath+'//'+itsname+'.txt','w') as f2:
        f2.write(txts)
    print('获取全文并保存成功')

if __name__ == "__main__":
    itspath=r"E:\各类比赛\数学建模\Python机器学习5个数据科学家案例解析配套数据-python-ml-case-studies-master\Book\Chapter 1 files\Listings" #文件夹目录
    itsname='alltext'#保存的文本名称
    read_all_txt(itspath, itsname)

以上是本人的个人总结,如有错误请各位大佬批评指正!!~

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pandas_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值