我有一个大的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。
答案 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内置的read
和write
逐行重写文件。根据您的文件大小,这可能需要一些时间来处理,但由于您正在逐行工作,因此不应耗尽内存。
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)
您也可以尝试使用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()
具有相似的功能。