我需要将具有400000行的tsv拆分为4个csv文件,其中包含100000行。
我的示例代码:
csvfile = open('./world_formatted.tsv', 'r').readlines()
filename = 1
for i in range(len(csvfile)):
if i % 100000 == 0:
open(str(filename) + '.tsv', 'w+').writelines(csvfile[i:i+100000])
filename += 1
我收到此错误:
'charmap' codec can't decode byte 0x8d in position 7316: character maps to <undefined>
答案 0 :(得分:0)
您可能会尝试将open
与encoding=
命名参数一起使用,以便Python知道要读取的编码。
不知道这个(根据十六进制代码看起来像Windows-CP1252文件,但我可能错了)你基本上没有运气。在* nix oder MacOS上,您可以使用file
命令尝试对编码进行有根据的猜测。
其次,您可能不应该尝试使用readlines()
读取列表中的所有内容。对于非常大的文件,这是一个记忆猪。通过迭代更好地流读取文件,如下所示。
MAXLINES = 100000
csvfile = open('./world_formatted.tsv', mode='r', encoding='utf-8')
# or 'Latin-1' or 'CP-1252'
filename = 0
for rownum, line in enumerate(csvfile):
if rownum % MAXLINES == 0:
filename += 1
outfile = open(str(filename) + '.tsv', mode='w', encoding='utf-8')
outfile.write(line)
outfile.close()
csvfile.close()
我确定您在运行后关闭了文件,只是添加它以确定。 : - )
如果您使用的是* nix&#39;操作系统(或MacOS),您可能需要查看完全相同的split
命令(以及更多):How to split a large text file into smaller files with equal number of lines?
答案 1 :(得分:0)
csvfile = open('./formatted.tsv', 'r',encoding="ISO-8859-1").readlines()
filename = 1
for i in range(len(csvfile)):
if i % 100000 == 0:
open(str(filename) + '.tsv', 'w+',encoding="ISO-8859-1").writelines(csvfile[i:i+100000])
filename += 1
这是问题的答案,谢谢大家的帮助。