【问题标题】:doing basic UNIX operations Pythonic way做基本的 UNIX 操作 Pythonic 方式
【发布时间】:2018-05-27 02:10:23
【问题描述】:

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

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

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

第二步。删除任何行开头的所有空格。

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

第三步。删除每行文本之间的所有额外空格。

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

所以,我想知道是否有任何更好的方法来以 Python 方式处理这个和那个,而不需要太多的计算时间。使用 UNIX 命令完成这 3 个步骤大约需要 5 分钟(最大)时间。

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

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

提前致谢。

【问题讨论】:

  • 我怀疑您能否获得更接近 UNIX 工具的性能。请注意,这些工具是用 C 语言编写的,并针对性能进行了高度优化。
  • 你需要在python中做,还是你只是认为python会更快?
  • 也许管道,至少,命令?这样就不会生成中间文件,并且单通道将转换给定文件?
  • @user1767754 是的,我想以最优化的方式使用 Python 完成这些操作
  • 您可以通过不使用正则表达式来删除字符来优化它。 python 在字符串上提供了.strip() 方法,使用.replace 您可以删除引号。我不确定替换的性能,但剥离前导/尾随空格应该更快。但总的来说,sed 应该非常快,而 bash 脚本中唯一慢的就是当您需要为每个文件生成一个包含大量文件的 sed 时。

标签: python csv unix sed


【解决方案1】:

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

$ cat file
 "this"  "that"

工作:

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

这是一个 awk 中的所有这些步骤:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多