Python 是否有一套简单的脚本来操作csv文件?

Python 是否有一套简单的脚本来操作csv文件?,python,perl,csv,Python,Perl,Csv,我正在寻找一些脚本,将允许操纵通用的csv文件 通常类似于: 添加行文件名插入\u行 获取行文件名GREP_行 替换行文件名GREP\u行插入\u行 删除行文件名GREP_行 在哪里 FILENAME csv文件的名称,第一行包含标题“,”用于分隔可能包含“,”的字符串 GREP_ROW一对字符串field1=value1[,fieldN=valueN,…],用于根据csv文件中的字段值标识行 插入_ROW一个用于替换(或添加)行字段的成对字符串field1=value1[,fieldN=va

我正在寻找一些脚本,将允许操纵通用的csv文件

通常类似于:

  • 添加行文件名插入\u行
  • 获取行文件名GREP_行
  • 替换行文件名GREP\u行插入\u行
  • 删除行文件名GREP_行
  • 在哪里

    • FILENAME csv文件的名称,第一行包含标题“,”用于分隔可能包含“,”的字符串
    • GREP_ROW一对字符串field1=value1[,fieldN=valueN,…],用于根据csv文件中的字段值标识行
    • 插入_ROW一个用于替换(或添加)行字段的成对字符串field1=value1[,fieldN=valueN,…]
    Peferly在python中使用csv包。。。
    理想情况下,利用python将每个字段关联为一个变量,并允许更高级的GREP规则,如fieldN>XYZ

    Python中常用的方法是使用将数据加载到元组列表中,然后对该本地Python对象执行添加/替换/获取/删除操作,然后使用将文件写回

    对CSV文件的就地操作无论如何也没有多大意义。由于记录通常不是固定长度的,因此在不同时移动所有其他记录的情况下,插入、删除或修改记录是不容易的


    也就是说,Python有一种就地文件更新模式。

    Perl有一种源自unix理念的就地编辑传统

    例如,我们可以编写简单的add-row-by-num.pl命令,如下所示:

    #!/usr/bin/perl -pi
    BEGIN { $ln=shift; $line=shift; }
    print "$line\n" if $ln==$.;
    close ARGV if eof; 
    
    #!/usr/bin/perl -pi
    BEGIN { $regex=shift; $line=shift; }
    print "$line\n" if /$regex/;
    
    如果$ln==$,则将第三行替换为“$line\n”以替换行。消除
    $line=shift$替换第三行以删除行

    我们可以编写一个简单的add-row-by-regex.pl命令,如下所示:

    #!/usr/bin/perl -pi
    BEGIN { $ln=shift; $line=shift; }
    print "$line\n" if $ln==$.;
    close ARGV if eof; 
    
    #!/usr/bin/perl -pi
    BEGIN { $regex=shift; $line=shift; }
    print "$line\n" if /$regex/;
    
    或者简单地使用perl命令
    perl-pi-e'print“LINE\n”if/REGEX/;文件
    。同样,我们可以将
    打印$line
    替换为
    $\u=“$line\n”
    $\u=“”
    ,分别用于替换或删除

    如果eof,我们不需要
    关闭ARGV行,因为在处理每个文件后,我们不需要停止
    $。
    计数器

    普通的unix
    grep
    实用程序不够用,有什么原因吗?回想一下正则表达式
    (PATERN){n}
    匹配
    PATERN
    正好n次,即
    (\s*\s+\s*,){6}{\s*777\s*,)
    要求在第7列中使用777

    甚至还有一个perl正则表达式可以将
    fieldN=value
    对转换成这个正则表达式,尽管我自己会使用
    split
    map
    join


    顺便说一句,它为文件句柄提供了就地编辑功能。

    Perl有一个驱动程序,可以让你像访问SQL数据库一样访问CSV文件。我以前使用过它,但没有广泛使用过,所以我无法对它进行全面的审查。如果你的需求足够简单,这可能对你很有用。

    可以做一些这样的工作。

    有很多因此,如果需要,可以使用Text::CSV模块。诀窍是field=value意味着与field同名的标题需要具有相同的值…例如,我的CSV的第一行可能是:country,town,zip,我的query可能是replace row foo.CSV“town=NewYork,country=us”“zip=10010”这将指示用10010替换匹配us,NewYork的行的zip字段的内容…在这种情况下,开始行必须构建正则表达式,但可能一些CSV模块可以更轻松地为您处理。