【发布时间】:2020-04-28 04:29:06
【问题描述】:
好的, 我有一个大 (8 GB+) txt 文件,其中包含很可能来自大型机 b/c 的遗留数据,它都是必须逐行和逐字符解析的固定字段。逐行读取文件在小样本上工作正常,但不会超过几百 MB。
本质上,我想分批读取 txt 文件,比如每批 500 万行,然后逐行处理每个批处理。
那是我用 Python 写的,但由于某种原因,当在较小的文件上测试时,下面的代码最终会陷入无限循环。我有点困惑,中断实际上从未被触发并且快照一直被覆盖。知道如何解决吗?
# Python 3.x
def convert_txt_to_csv(path_to_txt, path_to_save_csv, column_names):
df = pd.DataFrame(columns=column_names)
chunksize = 5000 # 5000000 - 5 million batches for the big file
print("Add rows...")
with open(path_to_txt, 'r', encoding="ISO-8859-1") as file:
lines = True
cnt = 0
mil = 1
while lines:
lines = file.readlines(chunksize) # This guy should become False if there no more lines...
if not lines:
break # Double safety, if they're no more lines, escape the loop...
for line in lines:
process_line(line.replace('\n', ''), df, cnt)
cnt += 1
# save snapshot after each batch
df.to_csv(path_to_snapshot_csv)
print("Saved Snapshot: ", mil)
mil +=1
print("Process")
df = process(df)
print("Safe")
df.to_csv(path_to_save_csv)
print("Nr. of data: ", len(df.index))
【问题讨论】:
-
嗨 Marvin Hansen,您能否提供输入文件及其匹配输出的示例示例?
-
谢谢,刚刚添加了一个例子。只是说,转换适用于小样本。我要解决的实际问题是在 8GB 上逐行加速转换 b/c 需要永远和一天,因此是批量...
-
为什么不直接使用
readline()而不是readlines()? (注意末尾的s) -
嗯,它更快,因为将所有内容都保存在内存中会更快,但如果它太大,则没有太多替代方案。可能在实际将它们写入磁盘之前读取并处理几行(比如 1000 行),以减少 I/O 操作。
-
已解决 :-) 添加了答案。
标签: python python-3.x loops file