如何在python中读取大型tsv文件并将其转换为csv

时间:2019-03-11 02:00:39

标签: python pandas csv

我有一个大的tsv文件(大约12 GB),我想将其转换为csv文件。对于较小的tsv文件,我使用以下代码,该代码可以运行,但速度很慢:

import pandas as pd

table = pd.read_table(path of tsv file, sep='\t')
table.to_csv(path andname_of csv_file, index=False)

但是,此代码不适用于我的大文件,并且内核在中间重置。

有什么办法可以解决此问题?有人知道任务是否可以由Dask代替Pandas完成吗?

我正在使用Windows 10。

4 个答案:

答案 0 :(得分:2)

您无需逐行读取内存中的所有行,而是可以逐行读取并逐行处理它们:

使用Python 3.x:

fs=","
table = str.maketrans('\t', fs)
fName = 'hrdata.tsv'
f = open(fName,'r')

try:
  line = f.readline()
  while line:
    print(line.translate(table), end = "")
    line = f.readline()

except IOError:
  print("Could not read file: " + fName)

finally:
  f.close()

输入(hrdata.tsv):

Name    Hire Date       Salary  Sick Days remaining
Graham Chapman  03/15/14        50000.00        10
John Cleese     06/01/15        65000.00        8
Eric Idle       05/12/14        45000.00        10
Terry Jones     11/01/13        70000.00        3
Terry Gilliam   08/12/14        48000.00        7
Michael Palin   05/23/13        66000.00        8

输出:

Name,Hire Date,Salary,Sick Days remaining
Graham Chapman,03/15/14,50000.00,10
John Cleese,06/01/15,65000.00,8
Eric Idle,05/12/14,45000.00,10
Terry Jones,11/01/13,70000.00,3
Terry Gilliam,08/12/14,48000.00,7
Michael Palin,05/23/13,66000.00,8

命令:

python tsv_csv_convertor.py > new_csv_file.csv

注意:

如果使用Unix环境,只需运行命令:

tr '\t' ',' <input.tsv >output.csv

答案 1 :(得分:1)

如果我输入错了,请纠正我,但是TSV文件基本上是CSV文件,使用制表符而不是逗号。为了在python中有效地翻译,您需要遍历源文件的各行,用逗号替换选项卡,并将新行写入新文件。您不需要使用任何模块来执行此操作,实际上,用Python编写解决方案非常简单:

def tsv_to_csv(filename):
    ext_index = filename.rfind('.tsv')
    if ext_index == -1:
        new_filename = filename + '.csv'
    else:
        new_filename = filename[:ext_index] + '.csv'

    with open(filename) as original, open(new_filename, 'w') as new:
        for line in original:
            new.write(line.replace('\t', ','))

    return new_filename

像这样遍历各行仅将每一行逐一加载到内存中,而不是将整个内容加载到内存中。不过,处理12GB的数据可能需要一段时间。

更新: 实际上,考虑到这一点,在这样大的文件上使用二进制I / O,然后一次在文件的大块上用逗号替换制表符可能会更快。此代码遵循该策略:

from io import FileIO

# This chunk size loads 1MB at a time for conversion.
CHUNK_SIZE = 1 << 20


def tsv_to_csv_BIG(filename):
    ext_index = filename.rfind('.tsv')
    if ext_index == -1:
        new_filename = filename + '.csv'
    else:
        new_filename = filename[:ext_index] + '.csv'

    original = FileIO(filename, 'r')
    new = FileIO(new_filename, 'w')
    table = bytes.maketrans(b'\t', b',')

    while True:
        chunk = original.read(CHUNK_SIZE)
        if len(chunk) == 0:
            break
        new.write(chunk.translate(table))

    original.close()
    new.close()
    return new_filename

在使用1GB TSV文件的笔记本电脑上,第一个功能需要4秒才能转换为CSV,而第二个功能则需要1秒。如果您的存储空间可以保持不变,则调整CHUNK_SIZE参数可能会加快速度,但是1MB似乎是我的最佳选择。

使用另一个答案中提到的tr对我来说花了3秒钟,所以使用python块化方法似乎最快。

答案 2 :(得分:0)

您可以使用Python内置的readwrite逐行重写文件。根据您的文件大小,这可能需要一些时间来处理,但由于您正在逐行工作,因此不应耗尽内存。

with open("input.tsv", "r") as input_file:
    for line in input_file:
        with open("output.csv", "a") as output:
            line = line.replace("\t", ",")
            output.write(line)

答案 3 :(得分:0)

您可以使用chunksize遍历整个文件。请注意,这使用.read_csv()而不是.read_table()

df = pd.DataFrame()
for chunk in pd.read_csv('Check1_900.csv', header=None, names=['id', 'text', 'code'], chunksize=1000):
    df = pd.concat([df, chunk], ignore_index=True)

source


您也可以尝试使用low_memory=False标志(source)。


然后是memory_map(向下滚动到https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html

  

memory_map :布尔值,默认为False

     

如果为filepath_or_buffer提供了文件路径,则将文件对象直接映射到内存中并直接从那里访问数据。使用此选项可以提高性能,因为不再有任何I / O开销。

请注意,to_csv()具有相似的功能。