【问题标题】:csv reader outputs extra blank itemscsv阅读器输出额外的空白项
【发布时间】:2018-12-05 20:22:25
【问题描述】:

我有一个输入 csv,其中包含可变数量的列,我试图将其拉入列表。我的测试是解析输入 csv 并在 csv 列周围创建一个包含额外元素的列表。我想看到的是一个只包含 csv 元素的列表,而且我也得到了空的引用元素。我需要一些帮助来了解我缺少的 csv 阅读器的哪些选项。

示例输出:

$ python cond.py
opening conditions file  conditions.lst
parser  0  input line:
"string1:", "string1b,string1c,"
output list elements:
['string1:']
['', '']
['']
['string1b,string1c,']
[]

parser  1  input line:
"stringa:", "stringb,stringc,"
output list elements:
['stringa:']
['', '']
['']
['stringb,stringc,']
[]

parser  2  input line:
"string3:", "string3next=abc", "string3b","string3c:", "string3d"
output list elements:
['string3:']
['', '']
['']
['string3next=abc']
['', '']
['']
['string3b']
['', '']
['string3c:']
['', '']
['']
['string3d']
[]

输入文件:

$ cat conditions.lst
"string1:", "string1b,string1c,"
"stringa:", "stringb,stringc,"
"string3:", "string3next=abc", "string3b","string3c:", "string3d"

Python cond.py 文件:

$ cat cond.py

from __future__ import print_function
#from csv import reader

import re
import sys
import csv

# variables

conditionsFile = "conditions.lst"
parserConditions = []
numOfParsers = 0


print("opening conditions file ", conditionsFile)
with open(conditionsFile, "r") as cf:
  for line in cf:
    print("parser ", numOfParsers, " input line:")
    print(line.strip())

    r = csv.reader(line, quotechar='"', delimiter=',', quoting=csv.QUOTE_ALL, skipinitialspace=True)
    print("output list elements:")
    for cline in  r:
      print(cline)

    numOfParsers = numOfParsers + 1
    print("")

  print("total number of parsers: ", numOfParsers)

更新: 使用@Jean-FrançoisFabre 的帮助,我没有解决根本原因,但有一个解决方法 - 我将 csv 元素放入列表中,然后删除空白元素。

for cline in  r:
  conditions.extend(cline)

conditions = filter(None, conditions)
print(conditions)

【问题讨论】:

  • 因为您使用“w”模式而不是“wb”编写 csv
  • @Jean-FrançoisFabre 谢谢 - 这是一个有价值的提示。 csv 是由另一个 Linux 进程生成的,有没有办法在我的 python 脚本中读取它?
  • 好吧,你可以忽略空白行。
  • @Jean-FrançoisFabre .. 我可以立即执行此操作,只需检查空白元素并跳过它们,但由于输入文件只有 \n 分隔行,我仍然对 csv 阅读器的行为感到困惑(在输入文件上做了 od -c)

标签: python python-2.7 csv


【解决方案1】:

csv.reader 接受一个类似文件的对象而不是字符串......所以它奇怪地迭代一行的字符而不是文件的行。你只需要:

from __future__ import print_function
import csv

with open('conditions.lst','rb') as cf:
    r = csv.reader(cf,skipinitialspace=True)
    for line in r:
        print(line)

输出:

['string1:', 'string1b,string1c,']
['stringa:', 'stringb,stringc,']
['string3:', 'string3next=abc', 'string3b', 'string3c:', 'string3d']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多