如何根据行数拆分TSV文件

时间:2018-05-22 09:40:50

标签: python csv

我需要将具有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>

2 个答案:

答案 0 :(得分:0)

您可能会尝试将openencoding=命名参数一起使用,以便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

这是问题的答案,谢谢大家的帮助。