【问题标题】:What is the advantage of using csv.reader over writing my own parser in python使用 csv.reader 比在 python 中编写我自己的解析器有什么优势
【发布时间】:2017-01-13 15:03:43
【问题描述】:

如果下面两个代码 sn-ps 给出相同的结果,那么请告诉我使用csv.reader 的优势是什么

1)

import csv
f = open('a.csv', 'rb')
spamreader = csv.reader(f)
for a in spamreader:
    print a
  1. f = open('a.csv', 'rb') 对于 f 中的 a: 打印 a.split(',')

结果:

['SNO', ' Name', ' Dept']
['1', ' Def', ' Electronics']
['2', 'Abc', 'Computers']

【问题讨论】:

  • 在你的情况下,它是一样的。但是当字段中有引号或逗号时,csv确实更容易处理。
  • 您是否注意到您没有为csv.reader 提供分隔符?
  • 将 CSV 中的第一行更改为 1,"Evil,Commas",Electronics,您会看到不同之处 :-)
  • @Abdou csv 模块在那里没有任何魔力。昏迷是默认设置。模块中有一个sniffer 方法可以尝试猜测设置,但这是另一回事。
  • @Ev.Kounis,如果您在这种情况下不必指定或拆分,这对我来说仍然很神奇。我知道它变得更加复杂,文件更加混乱。但正如你所说,那是另一回事了。

标签: python python-2.7 csv


【解决方案1】:

在您的示例中,我没有看到使用 csv module 的优势。但是,当您引用元素时,情况会发生变化:

SNO,Name,Dept
1,Def,Electronics
2,Abc,Computers
3,"here is the delimiter, in quotes",ghi

有了csv模块,就很简单了

import csv
with open('a.csv', 'rb') as f:
    csv_reader = csv.reader(f, delimiter=',', quotechar='"')
    for row in csv_reader:
        print(row)

但拆分会忽略引号。

(无论如何,我建议使用 pandas,如 here 所示来读取 CSV 文件。还请注意,您应该关闭已打开的文件。通过使用 with 语句,您可以隐式执行。)

【讨论】:

    【解决方案2】:

    我澄清了你的问题,因为csv.reader() 一个迭代器。您的问题将 csv 模块与编写您自己的解析器进行了比较。

    优点是csv 模块实际上实现了 CSV 格式(包括引号、转义和嵌入的换行符等),而您编写的幼稚解析器则没有。所以使用csv 模块更正确,实际上代码也更简单!

    【讨论】:

      【解决方案3】:

      正如其他人已经提到的,它在引用元素时很有用。但我将展示 CSV 模块的另一个出色功能。

      如果您从其他地方收到不同的文件,但您不知道它们使用了哪些分隔符来分隔字段,该怎么办?当 CSV 模块具有 Sniffer 类并且已经为您实现时,您无法预测并且您不想实现解析所有可能的分隔符的逻辑。

      样本:

      line1|hey|20|40|50
      line2|hey|20|40|50
      line3|hey|20|40|50
      line4|hey|20|40|50
      line5|hey|20|50|60
      line6|hey|20|50|60
      ...
      

      代码:

      import csv
      
      # The more you increase this value, the more accurate CSV can guess the dialect.
      sample_bytes = 200
      sniffer = csv.Sniffer()
      
      with open('s.txt') as f:
          dialect_object = sniffer.sniff(f.read(sample_bytes))
      
          # to start from the beginning
          f.seek(0)
      
          reader = csv.reader(f, dialect=dialect_object)
          for line in reader:
              print(line)
      

      输出:

      ['line1', 'hey', '20', '40', '50']
      ['line2', 'hey', '20', '40', '50']
      ['line3', 'hey', '20', '40', '50']
      ['line4', 'hey', '20', '40', '50']
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-14
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2013-12-12
        • 2018-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多