Python利器:os与chardet读取多编码文件

在数据处理中会遇到读取位于不同位置的文件,每个文件所在的层级不同,而且每个文件的编码类型各不相同,那么如何高效地读取文件呢?

在读取文件时首先需要获取文件的位置信息,然后根据文件的编码类型来读取文件。本文将使用os获取文件路径,使用chardet得到文件编码类型。

获取文件路径

  1. 相同层级下的文件
import os

data_files = []
files_dir = "./data"

dirs = os.listdir(files_dir)
for dir in dirs:
  file_path= os.path.join(files_dir,dir)
  data_files.append(file_path)

print(data_files)

  1. 不同层级下的文件
txt_files = []
init_dir = "../data"

for root, dirs, files in os.walk(init_dir):
    for file in files:
        if file.endswith(".txt"):
            file_path = os.path.join(root, file)
            txt_files.append(file_path)

print(txt_files)

读取文件

import chardet
from tqdm import tqdm

fs = open('../summary.txt','w',encoding='utf8')

read_files = []
not_read_files = []

for txt_file in tqdm(txt_files):
    with open(txt_file,'rb') as t:
        t_d = t.read()
        encode_name = chardet.detect(t_d)['encoding']
        if encode_name=='GB2312':
            encode_name='gbk'
    try:
        with open(txt_file,'r',encoding=encode_name) as ft:
            temp_list = ft.readlines()
            for line in temp_list:
                if line:
                    fs.write(line)
                    fs.write('\n')
            read_files.append(txt_file)
    except Exception as e:
        not_read_files.append(txt_file)

print(f"不能读取的文件:{no_read_files}")

fs.close()

no_read_files是未能读取的文件列表。

在代码中将检测到GB2312的编码类型转换为gbk,因为gbkGB2312的父级编码,使用gbk可以尽量减少错误。

完整代码

import os
import chardet
from tqdm import tqdm

txt_files = []
init_dir = "../data"

for root, dirs, files in os.walk(init_dir):
    for file in files:
        if file.endswith(".txt"):
            file_path = os.path.join(root, file)
            txt_files.append(file_path)

fs = open('../summary.txt','w',encoding='utf8')

read_files = []
not_read_files = []

for txt_file in tqdm(txt_files):
    with open(txt_file,'rb') as t:
        t_d = t.read()
        encode_name = chardet.detect(t_d)['encoding']
        if encode_name=='GB2312':
            encode_name='gbk'
    try:
        with open(txt_file,'r',encoding=encode_name) as ft:
            temp_list = ft.readlines()
            for line in temp_list:
                if line:
                    fs.write(line)
                    fs.write('\n')
            read_files.append(txt_file)
    except Exception as e:
        not_read_files.append(txt_file)

print(f"不能读取的文件:{no_read_files}")
fs.close()

参考

[1] https://zhuanlan.zhihu.com/p/643279312

[2] https://www.jb51.net/article/211203.htm

[3] https://blog.csdn.net/weixin_48030475/article/details/126311995?spm=1001.2014.3001.5502

你可能感兴趣的:(python知识,python,windows,服务器)