Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从stdin获取文件名_Python - Fatal编程技术网

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是全新的谢谢!我添加了一些输出:)