枚举(fileinput.input(file))和枚举(文件)之间的差异

flo*_*14n 6 python file-io enumerate

我正在寻找一些有关我的代码的帮助,下面是严格的:

for file in file_name :
    if os.path.isfile(file):
        for line_number, line in enumerate(fileinput.input(file, inplace=1)):
            print file
            os.system("pause")
            if line_number ==1:
                line = line.replace('Object','#Object')
                sys.stdout.write(line)
Run Code Online (Sandbox Code Playgroud)

我想修改一些以前提取的文件,以便用matplotlib绘制它们.为此,我删除一些行,评论其他人.

我的问题如下:

  • 使用for line_number, line in enumerate(fileinput.input(file, inplace=1)):只给我5个以前提取的文件中的4个(当查看file_name列表包含5个引用时!)

  • 使用for line_number, line in enumerate(file):给我5个先前提取的文件,但我不知道如何使用相同的文件进行修改而不创建另一个...

你对这个问题有什么看法吗?这是正常的问题吗?

Mar*_*ans 2

有很多事情可能会对您有所帮助。

首先file_name出现的是文件名列表。命名可能会更好file_names,然后您就可以将其用于file_name每一个。您已验证这确实包含 5 个条目。

enumerate()函数用于在枚举项目列表时提供帮助,以便为每个循环提供索引和项目。这使您不必使用单独的计数器变量,例如

for index, item in enumerate(["item1", "item2", "item3"]):
    print index, item
Run Code Online (Sandbox Code Playgroud)

会打印:

0  item1
1  item2
2  item3
Run Code Online (Sandbox Code Playgroud)

这并不是真正必需的,因为您已经选择使用该fileinput库。其设计目的是获取文件列表并在一个循环中迭代所有文件中的所有行。因此,您需要稍微调整您的方法,假设您的文件列表被调用file_names,然后您编写如下内容:

# Keep only files in the file list
file_names = [file_name for file_name in file_names if os.path.isfile(file_name)]

# Iterate all lines in all files
for line in fileinput.input(file_names, inplace=1):
    if fileinput.filelineno() == 1:
        line = line.replace('Object','#Object')
        sys.stdout.write(line)  
Run Code Online (Sandbox Code Playgroud)

这里的要点是,最好在将列表传递给fileinput. 我将由您来修复输出。

fileinput提供了许多函数来帮助您确定当前正在处理哪个文件或行号。