如何从 python 脚本中获取多个文件的内容

How to cat contents of multiple files from a python script

我想要 cat 从 python 脚本生成的文件的内容。是否可以通过简单的一行命令来做到这一点?例如我想要这样的东西:

cat <(python test.py) # doesnt work as I want to

其中 test.py 生成多个文件名(以换行符分隔)

file1.txt
file2.txt
file3.txt

我想基本做到

cat file1.txt
cat file2.txt
cat file3.txt

基本上读取脚本生成的文件名的内容。假设 python 脚本可以生成 hundreds/thousands 个文件名。

尽管这似乎可行

cat $(python test.py)

但问题是它似乎要等到整个 python test.py 完成后,才会执行任何 cat。基本上它似乎不会在获得文件名后立即抓取文件名的内容。哪里

cat <(python test.py)

cat 获取文件名,不幸的是,它只打印文件名而不是文件名的内容。

你可以使用 sed

$ sed 's/^/cat /e' <(python3 test.py)

这将在执行命令之前在每个文件名前面添加 cat

^ - 这会将查找锚定到每行的开头

cat - cat 将替换每行开头的锚点

e - 这告诉 sed 执行由替换产生的命令,在本例中为 cat file1.txt

我认为您需要在脚本中使用这些文件创建 STDOUT:

例如test.py

import os
for i in range(0,5):
  name="file" + str(i) +".txt"
  f = open(name, "a")
  f.write("Hello\n")
  f.close()
  print(name) 

像这样:

$ python test.py
file0.txt
file1.txt
file2.txt
file3.txt
file4.txt

$ cat $(python test.py)
Hello
Hello
Hello
Hello
Hello

如果你想让 cat 即时工作,就没那么简单了,因为在 单行中 bash我们必须等待上一个命令完成。 但是你可以尝试做这样的事情:

$ python test.py > /dev/null &
$ watch -n10 'find ./  -maxdepth 1 -type f -mtime -10s -exec cat {} \;'

我的例子:

$ 
$ ls
test.py
$ cat test.py 
import os
import time
for i in range(0,500):
  name="file" + str(i) +".txt"
  f = open(name, "a")
  f.write("Hello" + str(i) +"\n")
  f.close()
  print(name)
  time.sleep(1)
$ python test.py >/dev/null &
[1] 28579
$ 
$ watch -n10 'find ./  -maxdepth 1 -type f -mtime -10s -exec cat {} \;'
Every 10.0s: find ./  -maxdepth 1 -type f -mtime -10s -exec cat {} \;                                                                                                                     MacBook-Air-Viktor.local: Sun Dec 12 10:41:49 2021

Hello264
Hello265
Hello267
Hello266
Hello262
Hello263
Hello261
Hello260
Hello268

不要像 那样使用 sed,您应该考虑 xargs:

python3 test.py | xargs -i cat "{}"

这比 sed + cat 更可靠,因为与 sed 解决方案不同,它适用于包含许多非常规字符的文件名,例如 '*''?'' '(但不包括 '\n')。

对您的 python 脚本做一个小改动,可以使其与同样具有 '\n' 个字符的文件名一起工作。 python 脚本中的更改将使用 '[=22=]' 而不是 '\n' 来分隔文件名(确保在每个此类文件名后刷新标准输出)。然后使用 xargs-0 参数:

python3 test.py | xargs -0 -i cat "{}"

现在,一旦您使用 [=26=] 而不是 \n 来分隔文件名,您的解决方案就适用于所有可能的文件名。