Python 是否有一套简单的脚本来操作csv文件?
我正在寻找一些脚本,将允许操纵通用的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
- FILENAME csv文件的名称,第一行包含标题“,”用于分隔可能包含“,”的字符串
- GREP_ROW一对字符串field1=value1[,fieldN=valueN,…],用于根据csv文件中的字段值标识行
- 插入_ROW一个用于替换(或添加)行字段的成对字符串field1=value1[,fieldN=valueN,…]
理想情况下,利用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如果$ln==$,则使用$替换第三行代码>以删除行
我们可以编写一个简单的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代码>行,因为在处理每个文件后,我们不需要停止$。
计数器
普通的unixgrep
实用程序不够用,有什么原因吗?回想一下正则表达式(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模块可以更轻松地为您处理。