【问题标题】:How to use csv reader object multiple times如何多次使用csv阅读器对象
【发布时间】:2017-08-11 16:55:09
【问题描述】:

我正在做一个python项目。我打开了一个新的csv文件,它的内容是

 A     |  B
  -------------
  1.  200 | 201   
  2.  200 | 202
  3.  200 | 201
  4.  200 | 203
  5.  201 | 201
  6.  201 | 202
  ...........

而我正在做的是……

def csvvalidation(readers):
    for row in readers:
        print row
def checkduplicationcsv(reader):
    datalist = []
    for row in reader:
        print row
        content = list(row[i] for i in range(0,3))
        datalist.append(content)     
with open("new.csv", "rb") as infile:
    reader = csv.reader(infile)
    first_row = next(reader, None)  # skip the headers
    checkduplicationcsv(reader)
    csvvalidation(reader)

问题是我只能打印一次值。csvvalidation() 函数读取器不起作用。我怎样才能多次使用读取器对象。我无法打印它的行值。我该怎么办?请给我一个解决方案。我不知道seek()(我认为它再次指向同一个读者)。所以我在第一个函数之后尝试了infile.seek(0),但没有使用。什么也没发生

提前致谢。

【问题讨论】:

    标签: python csv reader


    【解决方案1】:

    阅读器被包裹在一个文件指针周围,当它用完时,它就用完了。不要多次使用,使用一次,然后使用你读取的数据数组:

    with open("new.csv", "rb") as infile:
        reader = csv.reader(infile)
        first_row = next(reader, None)  # skip the headers
        data = list(reader)             # read everything else into a list of rows
    
    checkduplicationcsv(data)
    csvvalidation(data)
    

    是的,您的两个函数无需修改即可工作(除非它们已经损坏),因为列表、文件和 csv 阅读器都是可以迭代的“可迭代对象”。不是 Python 盛大...

    【讨论】:

    • 它将读取文件中的所有内容。试试吧。或查找list()
    • 感谢您的回答。不使用列表我可以使用它吗??
    • 我不知道该如何回答。为什么不想使用列表?你想做什么呢?
    【解决方案2】:

    它有效。你应该再次检查你的代码:)

    with open("new.csv", "rb") as infile:
        reader = csv.reader(infile)
        first_row = next(reader, None)  
        checkduplicationcsv(reader)
        infile.seek(0)        # <- Add infile.seek(0)
        csvvalidation(reader)
    

    【讨论】:

    • 看看我的问题我试过这个方法但它不起作用。然后我认为问题可能是打开文件的方式。我没有使用这种方法打开文件。 file = open('new.csv', 'rb')。所以我想可能是这个问题
    • @bobmarti 这也适用于我。不知道为什么它不适合你。
    • @bobmarti 真的吗?至少在我的 Python2.7 环境中,该代码运行良好。让我们减少 CSV 文件中的数据并再次尝试检查。
    • @tellk 我也在使用 python 2.7。而且 excel 文件太大。我把它减少到只有 5 行。但它不工作
    • @bobmarti 是否会将 5 行 (CSV) 的内容和执行结果添加到问题部分?
    【解决方案3】:

    如果您无法将整个文件读入内存,您可以通过tee 创建两个阅读器:

    from itertools import tee
    with open("new.csv", "rb") as infile:
        reader = csv.reader(infile)
        first_row = next(reader, None)  # skip the headers
        reader1, reader2 = tee(reader, 2)
        checkduplicationcsv(reader1)
        csvvalidation(reader2)
    

    【讨论】:

    • 注意,使用 tee 可能会丢失一些功能,例如:'itertools.tee' object has no attribute 'line_num'
    猜你喜欢
    • 2015-11-25
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多