做基本的UNIX操作Pythonic方式

时间:2017-12-13 08:42:05

标签: python csv unix sed

我有一个空格分隔文件(file1.csv),我手动执行3个UNIX操作,即:

步骤1。从每行中删除所有双引号(“)。

sed 's/"//g' file1.csv > file_tmp1.csv

步骤2。删除任何行开头的所有空格。

sed 's/^ *//' file_tmp1.csv > file_tmp2.csv

步骤3。删除每行文本之间的所有其他空格。

cat file_tmp2.csv | tr -s " " > file1_processed.csv

所以,我想知道是否有更好的方法来实现这一点,以及在没有太多计算时间的情况下以Pythonic方式。使用UNIX命令完成后,这3个步骤大约需要5分钟(最长)。

请注意,文件file1.csv空格分隔文件,我希望它保持空格分隔。

此外,如果您的解决方案建议将整个file1.csv加载到内存中,那么我会请求您建议以块的方式完成此操作,因为文件太大(约20 GB左右)无法加载到内存中每一次。

提前感谢。

2 个答案:

答案 0 :(得分:2)

明显的改进是将tr步骤转换为sed并将所有部分合并为一个作业。首先是测试数据:

$ cat file
 "this"  "that"

工作:

$ sed 's/"//g;s/^ *//;s/ \+/ /g' file
this that

这里有一个awk中的所有步骤:

$ awk '{gsub(/\"|^ +/,""); gsub(/ +/," ")}1' file
this that

如果你测试它,请告诉我它花了多长时间。

答案 1 :(得分:0)

这是一个一次读取一行并执行您在Python中指定的替换的过程。

with open('file1.csv') as source:
    for line in source:
        print(' '.join(line.replace('"', '').split())

split()的默认行为包括修剪任何前导(和尾随)空格,因此我们不会明确指定。如果您需要保留尾随空格,可能需要更新您的要求。

您的shell脚本尝试使用多个临时文件和sed的多次调用都不是如何在shell中执行此操作的一个很好的示例。