Python中相当于Perl的(<>)是什么?fileinput无法正常工作

7 投票
7 回答
897 浏览
提问于 2025-04-16 09:10

在Perl中,你可以这样做:

while (<>) {
    # process files given as command line arguments
}

在Python中,我发现了:

import fileinput
for line in fileinput.input():
    process(line)

但是,当命令行中给出的文件不存在时,会发生什么呢?

比如说,命令是 python test.py test1.txt test2.txt filenotexist1.txt filenotexist2.txt test3.txt

我尝试了各种方法来使用 try: except: nextfile,但似乎都没有成功。

对于上面的命令,脚本应该能处理 test1-3.txt,但是当文件找不到时,它应该默默地跳到下一个文件。

Perl在这方面做得很好。我在网上搜索了很久,但找不到这个问题的答案。

7 个回答

3

像这样;

import sys

for f in sys.argv[1:]:
    try:
        data = open(f).readlines()
        process(data)
    except IOError:
        continue
3

把@Brian的回答改成一个生成器,并且捕捉IOError错误,而不是检查文件是否存在,这样更符合Python的风格,然后在失败时向标准错误输出一个警告:

import sys

def read_files(files = None):
  if not files:
    files = sys.argv[1:]
  for file in files:
    try:
      for line in open(file):
        yield line
    except IOError, e:
      print >>sys.stderr, 'Warning:', e

for line in read_files():
  print line,

输出(文件baz不存在):

$ python read_lines.py foo bar baz
line 1 of foo
line 2 of foo
line 1 of bar
line 2 of bar
Warning: [Errno 2] No such file or directory: 'baz'

你可能想花点时间整理一下错误信息,但这可能不太值得。

5
import sys
import os

for f in sys.argv[1:]:
    if os.path.exists(f):
        for line in open(f).readlines():
            process(line)

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答