【问题标题】:No Newlines in the CSV when the field of the Dict is empty [Python, CSV]当 Dict 的字段为空时,CSV 中没有换行符 [Python, CSV]
【发布时间】:2011-08-22 09:07:26
【问题描述】:

我是python初学者,(我实际用的是2.7版本)

我的代码实际上运行良好(很简单) 但它在我的输出文件中的 reslut 之间插入新行。我注意到他们在文档中提到了它(见进一步),但没有办法避免在字段为空时自动插入换行符。

谁能帮帮我?

new= csv.DictReader(ifile,fieldnames=None)
output = csv.DictWriter(ofile,fieldnames=None,dialect='excel',delimiter="\t")


for item in new:
    output.writer.writerow(item.values())
    print item

在 2.5 版中更改:解析器现在对多行引用字段更加严格。以前,如果一行在带引号的字段中结束而没有终止换行符,将在返回的字段中插入换行符。在读取字段中包含回车符的文件时,此行为会导致问题。行为已更改为在不插入换行符的情况下返回字段。因此,如果嵌入在字段中的换行符很重要,应以保留换行符的方式将输入分成几行

结果:

{'Url;Site Source;Communaute': 'lafranceagricole.fr;Site Media;'} {'Url;Site Source;Communaute': 'economiesolidaire.com;Blog;'} {'Url;Site Source;Communaute': 'arpentnourricier.org;Blog;'} {'Url;Site Source;Communaute': 'arpentnourricier.org;Blog;'} {'Url;Site Source;Communaute': 'mamienne.canalblog.com;Blog;'}

所以我有一个错误,我的标题正在成为关键而不是简单的标题 如我所愿(网址;网站来源;社区) {lafranceagricole.fr;网站媒体}

我的 csv 中没有空行,因此新行可能不是由空白字段生成的。 也许字段 Community 由默认为空创建新行

【问题讨论】:

  • 向我们展示您的dict 中触发问题的内容的示例?我没看到。
  • {'Url;Site Source;Communaute': 'lafranceagricole.fr;Site Media;'} {'Url;Site Source;Communaute': 'economiesolidaire.com;Blog;'} {'Url ;网站来源;Communaute': 'arpentnourricier.org;Blog;'} {'Url;Site Source;Communaute': 'arpentnourricier.org;Blog;'} {'Url;Site Source;Communaute': 'mamienne.canalblog. com;博客;'}

标签: python csv dictionary


【解决方案1】:

如果您希望; 成为字段分隔符,您必须指定:

new = csv.reader(ifile, delimiter=';')
output = csv.writer(ofile,dialect='excel',delimiter="\t")
for item in new:
    output.writerow(item)

这同样适用于 DictReader 来分隔字段。

写入以制表符分隔的字段;我根本看不到任何空白行。


问题得到澄清之前的旧答案

如果您只想要单元格值而不是字段名称,我不清楚您为什么使用DictReader 来读取您的输入。但是,如果由于某种原因您确实需要使用DictReader

from itertools import chain
output.writer.writerow(list(chain.from_iterable(item.values() for item in new)))

将所有值(制表符分隔)写入输出文件,中间没有换行符。

如果你真的不需要DictReader

new = csv.reader(ifile)
output = csv.writer(ofile,dialect='excel',delimiter="\t")

next(new) # to skip the field names
output.writerow(list(chain.from_iterable(new)))

将再次将单元格作为一行(制表符分隔)写入输出文件。

【讨论】:

  • 我需要一个 dictReader 因为我需要比较两个文件的值。
  • 无论我的答案是否适用——将; 指定为输入文件中的字段分隔符。此外,您可以通过对两者执行list(reader) 来比较reader 读取文件。
  • 好的:新行是分隔符的问题。但是链模块根本不起作用。我不能使用阅读器,因为我想知道 url(key) 已经在我的字典中,如果它已经存在并且值不为空,请写下这个...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2017-08-25
  • 2018-08-30
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 2015-08-18
相关资源
最近更新 更多