如何从 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
来分隔文件名,您的解决方案就适用于所有可能的文件名。
我想要 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
来分隔文件名,您的解决方案就适用于所有可能的文件名。