如何从stdin获取文件名

时间:2016-03-23 15:23:01

标签: python

我正在编写一个脚本,我正在从控制台运行它,就像这样

cat source_text/* | ./mapper.py

我希望得到当时每个文件的文件名。源文本文件夹包含一堆文本文件,其文件名我需要在我的映射器脚本中提取。

这可能吗?

import sys
import re
import os


# re is for regular expressions
pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*",
                     re.MULTILINE | re.DOTALL | re.IGNORECASE)


# Read pairs as lines of input from STDIN
for line in sys.stdin:
    ....

3 个答案:

答案 0 :(得分:1)

这是不可能的。您可以修改程序以直接从以下文件中读取:

import sys
import re

# re is for regular expressions
pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*",
                     re.MULTILINE | re.DOTALL | re.IGNORECASE)
for filename in sys.argv[1:]:
    with open(filename, "rU") as f:
        for line in f.readlines():
            if pattern.search(line) is not None:
                print filename, line,

然后你可以用:

来调用它
$ ./grep_files.py source_text/*

答案 1 :(得分:1)

你不能直接这样做,但fileinput模块可以帮助你。

你必须以这种方式打电话给你:

./mapper.py source_text/*

并以这种方式改变:

import fileinput
...

# Read pairs as lines of input from STDIN
for line in fileinput.input():
    ...

然后,正在处理的文件的名称可用fileinput.filename(),您还可以访问当前文件中的行号fileinput.filelineno()以及其他好东西......

答案 2 :(得分:1)

如果您使用此而不是cat:

grep -r '' source_text/ | ./mapper.py

mapper.py的输入将如下:

source_text/answers.txt:42
source_text/answers.txt:42
source_text/file1.txt:Hello world

然后您可以使用以下方法检索文件名:

for line in sys.stdin:
    filename, line = line.split(':', 1)
    ...

然而,Python能够迭代目录中的文件并逐行读取它们,例如:

for filename in os.listdir(path):
    for line in open(filename):
        ...