向后解析CSV文件

时间:2009-08-13 14:28:26

标签: python parsing csv readline

我的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文件?

如果我的导航方向正确,我不介意写一个小蟒蛇脚本。

8 个答案:

答案 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文件。你最好的办法是找到其他分隔符或停止重载逗号或引用/转义非字段分隔逗号