【问题标题】:Python CSV reader isn't reading CSV data the way I expectPython CSV 阅读器没有按照我期望的方式读取 CSV 数据
【发布时间】:2011-06-18 21:01:25
【问题描述】:

我正在尝试将一些 CSV 数据读入一个数组。我大概可以解释一下我在 Python 中比用英语要做得更好的地方:

>>> line = ImportFile.objects.all().reverse()[0].file.split("\n")[0]
>>> line
'"007147","John Smith","100 Farley Ln","","Berlin NH 03570","Berlin","NH",2450000,"John",24643203,3454,"E","",2345071,1201,"N",15465,"I",.00,20102456,945610,20247320,1245712,"0T",.00100000,"",.00,.00,780,"D","000",.00,0\r'
>>> s = cStringIO.StringIO()
>>> s
<cStringIO.StringO object at 0x9ab1960>
>>> s.write(line)
>>> r = csv.reader(s)
>>> r
<_csv.reader object at 0x9aa217c>
>>> [line for line in r]
[]

如您所见,CSV 数据始于内存,而不是文件。我希望我的读者有一些数据,但事实并非如此。我做错了什么?

【问题讨论】:

    标签: python django csv


    【解决方案1】:

    您以错误的方式使用StringIO。试试

    s = cStringIO.StringIO(line)
    r = csv.reader(s)
    next(r)
    # "['007147', 'John Smith', '100 Farley Ln', '', 'Berlin NH 03570', 'Berlin', 'NH', '2450000', 'John', '24643203', '3454', 'E', '', '2345071', '1201', 'N', '15465', 'I', '.00', '20102456', '945610', '20247320', '1245712', '0T', '.00100000', '', '.00', '.00', '780', 'D', '000', '.00', '0']"
    

    结果应该是你所期望的。

    编辑:更详细地解释:写入StringIO 实例后,文件指针将指向内容的末尾。这是您期望后续write() 调用写入新内容的地方。但这也意味着read() 调用不会返回任何内容。您需要调用s.reset()s.seek(0) 将位置重置为开头,或使用所需内容初始化StringIO

    【讨论】:

    • 这种方式在这种情况下是正确的,但有时您需要同时读取和写入StringIO对象;支持。
    【解决方案2】:

    s.write(line) 之后添加s.seek(0)。类文件对象s 中的当前指针刚刚超过写入的行。

    【讨论】:

      猜你喜欢
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多