当前位置: 首页 > 面试题库 >

CSV阅读器行为,无和空字符串

丰胤运
2023-03-14
问题内容

我想None在使用Python的csv模块在Python数据结构和csv表示形式之间来回切换时区分和空字符串。

我的问题是,当我运行时:

import csv, cStringIO

data = [['NULL/None value',None],
        ['empty string','']]

f = cStringIO.StringIO()
csv.writer(f).writerows(data)

f = cStringIO.StringIO(f.getvalue())
data2 = [e for e in csv.reader(f)]

print "input : ", data
print "output: ", data2

我得到以下输出:

input :  [['NULL/None value', None], ['empty string', '']]
output:  [['NULL/None value', ''], ['empty string', '']]

当然,我可以使用datadata2区分None和清空字符串,例如:

data = [d if d!=None else 'None' for d in data]
data2 = [d if d!='None' else None for d in data2]

但这会部分破坏我对csv模块的兴趣(在C中实现快速反序列化/串行化,尤其是在处理大型列表时)。

是否有一个csv.Dialect或参数csv.writer,并csv.reader能够使他们之间的区别'',并None在此用例?

如果不是,是否有兴趣实施补丁csv.writer以实现这种来回交互?(可能是Dialect.None_translate_to默认设置的参数''以确保向后兼容)


问题答案:

该文档建议您无法实现:

为了尽可能容易地与实现DB API的模块接口,将值None写入空字符串。

这在writer该类的文档中,表明所有方言都适用,这是csv模块的固有限制。

我会支持更改此代码(以及csv模块的其他各种限制),但可能是人们希望将此类工作分流到另一个库中,并使CSV模块保持简单(或至少如此简单)照原样)。

如果您需要更强大的文件读取功能,则可能需要查看numpy,scipy和pandas中的CSV读取功能,我记得其中有更多选择。



 类似资料:
  • 由于某种原因,一旦它命中,它就会退出并返回,而不是执行。 把转换成并检测莫尔斯电码中的双空格的最佳方法是什么? 本文摘自本codewars挑战:https://www.codewars.com/kata/54b724efac3d5402db00065e/train/java

  • 问题内容: 我有一个UTF-16 CSV文件,我必须阅读。Python csv模块似乎不支持UTF-16。 我正在使用python 2.7.2。我需要解析的CSV文件很大,要运行几个GB的数据。 回答以下约翰·马钦(John Machin)的问题 使用仅包含abc作为内容的test.csv输出 我认为csv文件是在美国Windows机器上创建的。我正在使用Mac OSX Lion。 如果我使用ph

  • 所以我有一个csv文件,其中的数字是整数,但有尾随。0 当我使用spark csv reader时,给出一个将列指定为整数的模式,它将返回null。 回报 当我将其读取为浮点数,然后将列转换为整数时,它有效。 显示器 这是正常行为吗?我可以将复杂的步骤保存为先读取浮点数,然后强制转换它们吗? 谢谢

  • 问题内容: 这是我目前正在使用的行 要跳过包含标题的csv的第一行。我不想使用任何分隔符,除了默认的一个逗号(,)已在默认构造函数中提供。在参数化构造函数中,可以选择跳过否。行,但如何处理构造函数的第二和第三参数。 - 谢谢 问题答案: CSVReader类的此构造方法在读取文件时将跳过csv的第一行。

  • 场景是:EventHub- 文件格式:CSV(带引号、管道分隔和自定义架构) 我正在尝试读取来自eventhub的CSV字符串。Spark成功地使用正确的模式创建了数据框,但在每条消息之后,数据框最终都是空的。 我设法在流媒体环境之外做了一些测试,当从文件中获取数据时,一切都很顺利,但当数据来自字符串时,一切都失败了。 所以我找到了一些链接来帮助我,但没有一个工作: can-i-read-a-cs

  • 问题内容: 我有一个包含字母数字键的数据框,我想另存为csv并在以后读取。由于种种原因,我需要以字符串格式显式读取此键列,所以我使用的键严格地是数字的,甚至更糟,例如:1234E5,Pandas会将其解释为浮点数。这显然使密钥完全无用。 问题是,当我为数据框或其中的任何列指定字符串dtype时,我只会得到垃圾回收。我在这里有一些示例代码: 数据框如下所示: 然后我像这样阅读: 结果是: 这是我的计