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

时间:2015-06-23 14:54:51

标签: 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)

我想修改一些以前提取的文件,以便用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个文件,但我不知道如何使用同一个文件进行修改而不创建另一个文件...

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

2 个答案:

答案 0 :(得分:2)

有很多事情可以帮到你。

首先file_name似乎是文件名列表。它可能更好地命名为file_names,然后您可以为每个file_name使用enumerate()。您已经确认这确实包含5个条目。

for index, item in enumerate(["item1", "item2", "item3"]): print index, item 函数用于在枚举项列表时提供帮助,以便为每个循环提供索引和项。这样可以节省您使用单独的计数器变量,例如

0  item1
1  item2
2  item3

会打印:

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) ,那么您可以按如下方式编写内容:

fileinput

这里的要点是,在将列表传递给fileinput之前预先过滤任何非文件名会更好。我会留给你修改输出。

vcl_recv提供了许多功能,可帮助您确定当前正在处理的文件或行号。

答案 1 :(得分:0)

假设你还有问题,我的典型方法是以只读方式打开文件,将其内容读入变量,关闭文件,制作edited变量,打开要写入的文件(擦除原始文件),最后写出edited内容。

我喜欢这种方法,因为如果我想测试我的编辑而不删除原始文件,我可以简单地更改写出来的file_name。

另外,我建议使用复数名词命名容器,如@Martin Evans建议。

import os

file_names = ['file_1.txt', 'file_2.txt', 'file_3.txt', 'file_4.txt', 'file_5.txt']
file_names = [x for x in file_names if os.path.isfile(x)] # see @Martin's answer again

for file_name in file_names:
    # Open read-only and put contents into a list of line strings
    with open(file_name, 'r') as f_in:
        lines = f_in.read().splitlines()

    # Put the lines you want to write out in out_lines
    out_lines = []
    for index_no, line in enumerate(lines):
        if index_no == 1:
            out_lines.append(line.replace('Object', '#Object'))
        elif ...
        else:
            out_lines.append(line)

    # Uncomment to write to different file name for edits testing
    # with open(file_name + '.out', 'w') as f_out:
    #     f_out.write('\n'.join(out_lines))

    # Write out the file, clobbering the original
    with open(file_name, 'w') as f_out:
        f_out.write('\n'.join(out_lines))

这种方法的缺点是每个文件都需要足够小以适应内存两次(lines + out_lines)。

祝你好运!