我有一个大的CSV文件(~250000行),在我完全解析和排序之前,我试图通过将其写入文本文件来显示它的一部分。
csvfile = open(file_path, "rb")
rows = csvfile.readlines()
text_file = open("output.txt", "w")
row_num = 0
while row_num < 20:
text_file.write(", ".join(row[row_num]))
row_num += 1
text_file.close()
我想迭代CSV文件,只将其中的一小部分写入文本文件,这样我就可以看看它是如何做到的,看看它对我有用。目前,文本文件最终为空。
我认为可能会这样做的方法是使用for循环迭代文件,该循环在经过一定次数的迭代后退出,但我可能错了,我不知道如何做到这一点,任何想法?
答案 0 :(得分:2)
你所做的事情没有什么特别的错误,但它并不是特别的Pythonic。特别是如果您只使用20行,那么在开始时使用readlines()
将整个文件读入内存似乎毫无意义。
相反,您可以在必要时使用具有枚举和中断的for循环。
csvfile = open(file_path, "rb")
text_file = open("output.txt", "w")
for i, row in enumerate(csvfile):
text_file.write(row)
if row_num >= 20:
break
text_file.close()
您可以使用with
块来打开文件,而不是显式关闭它们,从而进一步改善这一点。例如:
with open(file_path, "rb") as csvfile:
#your code here involving csvfile
#now the csvfile is closed!
另请注意,Python可能不是最好的工具 - 您可以直接从Bash执行此操作,例如,仅使用head -n20 csvfile.csv > output.txt
。
答案 1 :(得分:1)
一个简单的解决方案就是:
#!/usr/bin/python
# -*- encoding: utf-8 -*-
file_path = './test.csv'
with open(file_path, 'rb') as csvfile:
with open('output.txt', 'wb') as textfile:
for i, row in enumerate(csvfile):
textfile.write(row)
if i >= 20:
break
说明:
with open(file_path, 'rb') as csvfile:
with open('output.txt', 'wb') as textfile:
建议不要使用open
和close
,而是使用此行代替。只需在文件打开到新的缩进级别时写下要执行的行。
'rb'
和'wb'
是分别在'reading'
'writing'
和'binary mode'
打开文件所需的关键字
for i, row in enumerate(csvfile):
此行允许您逐行读取CSV文件,并使用元组(i, row)
为您提供行的内容及其索引。这是Python中令人敬畏的内置函数之一:有关它的更多信息,请查看here。
希望这有帮助!
编辑:请注意,Python有一个CSV package可以在没有enumerate
的情况下执行此操作:
# -*- encoding: utf-8 -*-
import csv
file_path = './test.csv'
with open(file_path, 'rb') as csvfile:
reader = csv.reader(csvfile)
with open('output.txt', 'wb') as textfile:
writer = csv.writer(textfile)
i = 0
while i<20:
row = next(reader)
writer.writerow(row)
i += 1
我们需要使用的是reader
和writer
。它们具有函数next
(读取一行)和writerow
(写入一行)。请注意,此处变量row
不是字符串,而是字符串列表,因为该函数本身执行split
作业。它可能比以前的解决方案更快。
此外,这样做的主要优点是允许您在文件中的任何位置查看,不一定从一开始(只需更改i
的界限)