我的csv文件格式如下:
CSV FILE
"a" , "b" , "c" , "d"
hello, world , 1 , 2 , 3
1,2,3,4,5,6,7 , 2 , 456 , 87
h,1231232,3 , 3 , 45 , 44
问题是第一个字段中有逗号“,”。我无法控制文件生成,因为这是我收到它们的格式。有没有办法从行尾到头开始向后读取CSV文件?
如果我的导航方向正确,我不介意写一个小蟒蛇脚本。
答案 0 :(得分:16)
rsplit
字符串方法从右边开始而不是从左边开始分割字符串,所以它可能正是你要查找的内容(它需要一个参数指定要分割的最大次数):
line = "hello, world , 1 , 2 , 3"
parts = line.rsplit(",", 3)
print parts # prints ['hello, world ', ' 1 ', ' 2 ', ' 3']
如果要从拆分列表中的每个项目的开头和结尾去除空白,那么您可以使用strip
方法和列表推导
parts = [s.strip() for s in parts]
print parts # prints ['hello, world', '1', '2', '3']
答案 1 :(得分:4)
我不完全理解你为什么要反向阅读每一行,但你可以这样做:
import csv
file = open("mycsvfile.csv")
reversedLines = [line[::-1] for line in file]
file.close()
reader = csv.reader(reversedLines)
for backwardRow in reader:
lastField = backwardRow[0][::-1]
secondField = backwardRow[1][::-1]
答案 2 :(得分:1)
你总是可以用正则表达式做一些事情,比如(perl regex)
#!/usr/bin/perl
use IO::File;
if (my $file = new IO::File("test.csv"))
{
foreach my $line (<$file>) {
$line =~ m/^(.*),(.*?),(.*?),(.*?)$/;
print "[$1][$2][$3][$4]\n";
}
} else {
print "Unable to open test.csv\n";
}
(第一个是贪婪搜索,最后3个不是) 修改:发布完整代码而不仅仅是正则表达式
答案 3 :(得分:1)
首先反转字符串然后处理它。
tmp = tmp [:: - 1]
答案 4 :(得分:1)
从您提供的示例中,看起来“列”是固定大小的。首先(带逗号的那个)是16个字符长,所以为什么不尝试逐行读取文件,然后读取前16个字符(作为第一列的值)的每一行,其余的相应?在获得每个值之后,您可以进一步解析它(修剪空格,等等......)。
答案 5 :(得分:1)
那不是一个CSV文件,逗号分隔就意味着。
你怎么能确定不是:
CSV FILE
"a" , "b" , "c" , "d"
hello , world , 1 , 2 , 3
1 , 2 , 3 , 4 , 5,6,7,2,456,87
h , 1231232 , 3 , 3 , 45,44
如果文件与您指示的那样,则第一组应该用引号括起来,看起来好像字段名称很奇怪,包含逗号的字段不是。
我不喜欢修复错误来源,我会推回数据生成器以提供正确的CSV,如果这是他们声称的那样。
答案 6 :(得分:0)
如果你总是期望相同数量的列,并且只有第一列可以包含逗号,那么只需读取任何内容并在开头连接多余的列。
问题是界面不明确,你可以尝试绕过这个,但更好的解决方案是尝试修复界面(这通常比创建几个补丁更难......)。
答案 7 :(得分:0)
我同意啤酒先生的意见。这是一个格式错误的csv文件。你最好的办法是找到其他分隔符或停止重载逗号或引用/转义非字段分隔逗号