【问题标题】:python csv module strip lines before parsing解析前的python csv模块条线
【发布时间】:2013-01-15 18:33:58
【问题描述】:

我有一个纯文本文件:

    2 jordyt
    2 dawder
    2 LOL12345
    2 2251084185
    2 123456789
    2 123456
    1 warcraft
    1 tripp88

通过python's csv模块解析后,我有:

with open(filename,'r') as csvfile:
    reader = csv.reader(csvfile,delimiter=' ')
    for row in reader:
        print row

['', '', '', '', '', '', '2', 'jordyt']
['', '', '', '', '', '', '2', 'dawder']
['', '', '', '', '', '', '2', 'LOL12345']
['', '', '', '', '', '', '2', '2251084185']
['', '', '', '', '', '', '2', '123456789']
['', '', '', '', '', '', '2', '123456']
['', '', '', '', '', '', '1', 'warcraft']
['', '', '', '', '', '', '1', 'tripp88']

编辑 1:

我希望输出是这样的:

['2', 'jordyt']
['2', 'dawder']
['2', 'LOL12345']
.
.
.

我可以使用自定义预处理器解决此问题。但是,这些文件太大了,不宜多读两遍。

我的问题是:我怎样才能告诉 csv 模块在解析之前去掉这些行?

【问题讨论】:

  • 输出到底应该是什么?

标签: python csv python-2.7


【解决方案1】:

一种选择是提供skipinitialspace 参数:

with open(filename,'r') as csvfile:
    reader = csv.reader(csvfile,delimiter=' ',skipinitialspace=True)
    for row in reader:
        print row

【讨论】:

  • 只需使用csv.reader(csvfile,delimiter=' ',skipinitialspace=True),也可以正常工作。
  • @AshwiniChaudhary - 谢谢!没有意识到您可以直接提供方言选项,但我现在在文档中看到了它。编辑了我的答案以改用它。
【解决方案2】:

如果你的分隔符是一个空格,那么我很想不使用 CSV 模块(如果你知道你没有带空格的引用字段):

这利用了split()split(None) 很好地处理连续分隔符的性质。

with open(filename,'r') as csvfile:
    for row in csvfile:
        print row.split()

或者,如果您需要处理它并使用 CSV 模块,只需在您的输入文件上创建一个生成器并将其传递给阅读器):

with open(filename,'r') as csvfile:
    stripped = (row.strip() for row in csvfile)
    reader = csv.reader(stripped,delimiter=' ')
    for row in reader:
        print row

【讨论】:

  • 我喜欢您的第一个示例,但我认为您需要更进一步并在行上使用 split,因为 FJ 似乎希望将单词分开。
  • @Lee-Man:实际上,我认为他的意思是split 而不是 strip
  • 实际上 - 是的,我做到了 :( - 更新了 - 感谢大家的关注
  • 是的,它有效。但 F.J 的答案正是我想要的。最少的代码更改,并在内置模块中使用预先创建的逻辑。而不是重建它们。
【解决方案3】:

我质疑你在这种情况下使用 csv,因为 split() 会做你想做的事。

with open(filename, 'r') as csvfile:
    for row in csvfile:
        words = row.split()
        print words

打印(用于您的数据):

['2', 'jordyt']
['2', 'dawder']
['2', 'LOL12345']
['2', '2251084185']
['2', '123456789']
['2', '123456']
['1', 'warcraft']
['1', 'tripp88']

【讨论】:

  • 嘿伙计,为什么在这种情况下需要 csv?我只是没看到。也许您提供的数据不能代表您真正需要解析的数据,但鉴于您提供的数据,csv 有点过头了。
  • 绝对你是真的,但只是为了培训目的,我想通过 csv 模块来做到这一点。所有这些线程都是通过 csv 模块创建的。你不能忽视它!
  • @pylover,我从你原来的问题中并不清楚,但现在明白了。
猜你喜欢
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2011-07-18
  • 2014-04-22
  • 2016-03-12
  • 2020-08-02
相关资源
最近更新 更多