【问题标题】:arranging text files side by side using python使用python并排排列文本文件
【发布时间】:2021-09-14 21:45:26
【问题描述】:

我在一个目录中有 3000 个文本文件,每个 .txt 文件包含单列数据。我想将它们并排排列,使其成为一个 mxn 矩阵文件。

例如:linux中的paste 1.txt 2.txt 3.txt 4.txt .............3000.txt

为此我尝试过

printf "%s\n" *.txt | sort -n | xargs -d '\n' paste

但是它给出了错误粘贴:filename.txt: Too many open files

请使用 python 提出更好的解决方案。

【问题讨论】:

  • import glob; pd.concat([pd.read_csv(file) for file in glob.glob("*.txt")], axis=1) 给了什么?
  • 您可以通过使用命令ulimit -n 4096 将打开文件限制设置为4096 来轻松避免该错误。(不是python 解决方案,所以我没有尝试将其作为答案。)
  • @cycolo 然后链接.dropna(how="all"),这样它就会删除包含所有NaNs 的行。
  • 我的意思是pd.concat([pd.read_csv(file) for file in glob.glob("*.txt")], axis=1).dropna(how="all")...
  • 没有minimal reproducible example,我只能这样做,也许其他人可以提供帮助。

标签: python pandas linux numpy for-loop


【解决方案1】:

根据收到的输入,请按照以下步骤操作。

# Change ulimit to increase the no of open files at a time
$ ulimit -n 4096

# Remove blank lines from all the files
$ sed -i '/^[[:space:]]*$/d' *.txt

# Join all files side by side to form a matrix view
$ paste $(ls -v *.txt) > matrix.txt

# Fill the blank values in the matrix view with 0's using awk inplace
$ awk -i inplace 'BEGIN { FS = OFS = "\t" } { for(i=1; i<=NF; i++) if($i ~ /^ *$/) $i = 0 }; 1' matrix.txt

【讨论】:

  • 非常感谢@BarathVutukuri 的聪明回答……终于解决了我的问题……你真是个专家……
  • 删除空行的sed步骤可以是可选的,可以直接使用paste命令运行awk。但是每种方法的输出都会有所不同。请检查哪个是您的场景所需的输出。
【解决方案2】:

你不需要 python 来做这个;如果您首先使用ulimit 增加进程可以打开的文件数,则使用paste 和@987654321 在bashzshksh93 shells 中以正确的顺序获取列变得很容易@ 以所需的顺序生成文件名,而不必对文件名扩展的结果进行排序:

% ulimit -n 4096
% paste {1..3000}.txt > matrix.txt

(我在 Linux 机器上对我提到的所有三个 shell 进行了测试,它可以与所有这些 shell 一起使用,没有关于命令行太长或其他任何错误的错误。)

您还可以安排让原始文件使用自然排序的不同命名方案,例如0001.txt0002.txt、...、3000.txt,然后只是paste [0-9]*.txt &gt; matrix.txt

【讨论】:

  • @cycolo -u 控制一个用户一次可以运行的进程数,在这里完全无关紧要。
  • 以防万一,[0-9]* 是名称以数字开头的任何文件,而不是名称仅以数字开头的任何文件。
  • 这是因为文件的长度不同。
  • @cyco lo 请检查所有文件中的行数是否相等。 wc -l *.txt
  • @Shawn 在不改变原始文件名的情况下,使用ls -v可以实现自然排序。 paste $(ls -v *.txt) &gt; output.txt
猜你喜欢
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多