我有一个名为writeLines(RMapsDemo, con = "RMapsDemo.R")
的字符串,我想用Python group_data
阅读。这是我正在打电话。
csv.reader
我希望只要满足以下条件之一就会引发异常:
group = csv.reader(group_data.split('\n'), delimiter=';',
doublequote=True, quoting=csv.QUOTE_ALL, strict=True)
"A";"B "bb" B";"C"
"A";"B ""bb"" B";"C")
代替A;B;C
但是,上面的摘录接受这两行都是正确的,即使使用"A";"B";"C"
,doublequote=True
和quoting=csv.QUOTE_ALL
设置也是如此。我应该设置另一个选项让它失败吗?如果这是不可能的,有没有其他方法可以快速注意到是否有单引号或不带引号的字段?
答案 0 :(得分:2)
对于它的价值,看起来Python 3.4拒绝你的第一个例子:
In [8]: mkreader = lambda x: csv.reader(x.split("\n"), delimiter=";", doublequote=True, quoting=csv.QUOTE_ALL, strict=True)
In [11]: for l in mkreader('''"A";"B ""bb"" B";"C"'''): print(l)
['A', 'B "bb" B', 'C']
In [12]: for l in mkreader('''"A";"B "bb" B";"C"'''): print(l)
...
Error: ';' expected after '"'
虽然它允许第二个:
In [13]: for l in mkreader('''A;B;C'''): print(l)
['A', 'B', 'C']
查看docs,似乎这是因为QUOTE_ALL
严格来说是作家设置,而不是读者设置:
csv.QUOTE_ALL
Instructs writer objects to quote all fields.
比较:
csv.QUOTE_NONNUMERIC
Instructs writer objects to quote all non-numeric fields.
Instructs the reader to convert all non-quoted fields to type float.
所以看起来你需要自己做这个,如果你想要的话。如果您知道;
永远不会出现在您的行中(这似乎是这种情况,因为您没有设置escapechar
),这很简单:
In [19]: def check_line(line):
for word in line.split(';'):
if word[0] != '"' or word[-1] != '"':
raise csv.Error("Bad input.")
In [20]: check_line("A;B;C")
...
Error: Bad input.