循环将通过Python中的CSV迭代一定次数

时间:2016-06-27 12:22:29

标签: python python-2.7 csv

我有一个大的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循环迭代文件,该循环在经过一定次数的迭代后退出,但我可能错了,我不知道如何做到这一点,任何想法?

2 个答案:

答案 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:

建议不要使用openclose,而是使用此行代替。只需在文件打开到新的缩进级别时写下要执行的行。

'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

我们需要使用的是readerwriter。它们具有函数next(读取一行)和writerow(写入一行)。请注意,此处变量row不是字符串,而是字符串列表,因为该函数本身执行split作业。它可能比以前的解决方案更快。

此外,这样做的主要优点是允许您在文件中的任何位置查看,不一定从一开始(只需更改i的界限)