Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中读取大型tsv文件并将其转换为csv_Python_Pandas_Csv - Fatal编程技术网

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

如何在python中读取大型tsv文件并将其转换为csv,python,pandas,csv,Python,Pandas,Csv,我有一个大的tsv文件(大约12GB),我想把它转换成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而不是熊猫是否可以完成任务

我有一个大的
tsv
文件(大约12GB),我想把它转换成
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而不是熊猫是否可以完成任务吗


我使用的是windows 10。

您可以使用Python内置的
读取
写入
逐行重写文件。这可能需要一些时间来处理,具体取决于您的文件大小,但它不应该耗尽内存,因为您正在逐行工作

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)

您可以逐行读取并逐个处理,而不是在内存中一次加载所有行:

使用
python3.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
python tsv_csv_convertor.py > new_csv_file.csv
命令:

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
注意:

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
env,只需运行以下命令:

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

如果我错了,请纠正我,但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
从io导入文件io
#此块大小一次加载1MB进行转换。

CHUNK_SIZE=1您可以使用
chunksize
逐段迭代整个文件。请注意,这使用了
.read\u csv()
而不是
.read\u table()


您也可以尝试
低内存=False
标志()


接下来是
内存映射
(向下滚动至)

内存映射:bool,默认为False

如果为filepath_或_buffer提供了filepath,请将文件对象直接映射到内存,并直接从内存访问数据。使用此选项可以提高性能,因为不再存在任何I/O开销


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

您在基于unix的系统上工作吗?如果是,您可以使用以下命令:
tr'\t',“output.csv
可以通过另一个字段进行更改,或者在Windows 10上工作。您的第二条评论我不清楚,无法理解。如果我们已经回答了您的问题,请您接受回答/投票,详细内容如下:此答案应该有效,但它不必要地打开和关闭输入中每一行的输出文件,如果输入为12GB,这可能会发生很多情况。这可能会让它慢很多。最好在for循环之外打开输出文件,并使用模式“w”而不是“a”。随着这些变化,你的答案基本上和我的一样。我同意。我编写的代码尽量可读,因为OP似乎不知道如何通过Python直接操作文本文件。如果他觉得有必要的话,他可以在以后对代码进行优化,或者他可以让代码运行一段时间,因为他现在只需要这个特定的文件。