Python 如何从stdin获取文件名
我正在编写一个脚本,并且像这样从控制台运行它Python 如何从stdin获取文件名,python,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.MULT
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:
....
这是不可能的。您可以修改程序以直接从以下文件读取:
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/*
这是不可能的。您可以修改程序以直接从以下文件读取:
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/*
您不能直接这样做,但fileinput模块可以帮助您 您只需这样称呼您的脚本:
./mapper.py source_text/*
import fileinput
...
# Read pairs as lines of input from STDIN
for line in fileinput.input():
...
这样做:
./mapper.py source_text/*
import fileinput
...
# Read pairs as lines of input from STDIN
for line in fileinput.input():
...
然后,正在处理的文件的名称可用作
fileinput.filename()
,您还可以访问当前文件中的行号作为fileinput.filelineno()
,以及其他一些好东西…您不能直接这样做,但fileinput模块可以帮助您
您只需这样称呼您的脚本:
./mapper.py source_text/*
import fileinput
...
# Read pairs as lines of input from STDIN
for line in fileinput.input():
...
这样做:
./mapper.py source_text/*
import fileinput
...
# Read pairs as lines of input from STDIN
for line in fileinput.input():
...
然后,正在处理的文件名可用作
fileinput.filename()
,您还可以访问当前文件中的行号,如fileinput.filelineno()
,以及其他一些好东西…如果您使用它而不是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):
...
如果使用此选项而不是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):
...
我认为你无法从管道中获取文件名。python看到的唯一东西是来自
cat
命令stdout的stdin。您是否可以建议解决方法?这是不可能的。您应该修改您的程序以直接从文件中读取。如果您想让shell扩展glob,请参阅,然后只需/mapper.py source\u text/*
并使用sys.argv
在打开文件的文件上进行迭代……我认为您无法从管道中获取文件名。python看到的唯一东西是来自cat
命令stdout的stdin。您是否可以建议解决方法?这是不可能的。您应该修改您的程序以直接从文件中读取。如果您想让shell扩展glob,请参阅,然后只需/mapper.py source\u text/*
并使用sys.argv
在打开文件的文件上迭代…对,那么我如何提取文件名来打印它呢?比如说在控制台中?@PetrosKyriakou:文件名在filename
变量中。啊,是的,现在它是如何工作的,我对python是全新的谢谢!我添加了一些输出:)对,我如何提取文件名来打印它,比如在控制台?@PetrosKyriakou:文件名在filename
变量中。啊,是的,现在它是如何工作的,我对python是全新的谢谢!我添加了一些输出:)