python - CSV Parse 有空单元格
问题描述
我正在使用 Python 3.5 从 CSV 中读取一行,并且缺少一些非常基本的内容:
s = '"Cats wheels.","Womp"\n'
reader = csv.reader(s)
for j in reader: print(j)
我希望这只会打印两个单元格,但它会打印:
['Cats wheels.']
['', '']
['Womp']
[]
有谁知道我怎样才能在这里得到一个两个单元格的解析?
解决方案
那是因为csv.reader
需要一个文件对象并遍历它。从文档中引用:
csvfile
可以是任何支持迭代器协议并在每次__next__()
调用其方法时返回一个字符串的对象——文件对象和列表对象都适用。
从以下位置读取时观察差异StringIO
:
import io
s = '"Cats wheels.","Womp"\n'
buff_s = io.StringIO(s)
reader = csv.reader(buff_s)
for j in reader:
print(j)
# ['Cats wheels.', 'Womp']
要在评论中回答您的问题:csv.reader
是否针对Iterator
s 进行类型检查,例如:
[j for j in csv.reader(123)] # reader on int type
# ... Traceback ... #
# TypeError: argument 1 must be an iterator
也就是说,支持该str
类型是因为它迭代,只是它本身无用,因为iter(some_str)
它被空字符串分割''
,所以每个 char 都被视为换行符。如果你真的想按字符串解析,你可以split
像这样指定你的字符串:
for j in csv.reader(s.split('\n')):
print(j)
# ['Cats wheels.', 'Womp']
# []
推荐阅读
- indexing - 更改了索引文件,然后我希望在 Solr 中更改搜索数据
- python - ModuleNotFoundError:没有名为“docxtpl”的模块
- python - 将列表中的子字符串替换为数据框中的另一个值
- java - 整个模拟过程中代理之间的恒定距离
- java - 如何使用junit命令行运行黄瓜测试运行器
- wordpress - 如何建立像谷歌这样的集中式认证网站?
- mongodb - 在 MongoDB 中设置空值
- javascript - Chrome 扩展程序 - 每次加载新页面时运行内容脚本
- r - 无法通过使用 ggplot2 从 excel 表调用来获取变量的绘图和日期日期
- ios - 如何从 AVPlayer 中提取整个流标题?