【问题标题】:looping filenames in python在python中循环文件名
【发布时间】:2017-01-16 09:14:15
【问题描述】:

我有几百个大文件(基于行号)。 我正在尝试使用循环编写代码。 首先循环读取文件夹中的大文件, 其次,它将创建一个与它正在读取的文件名相同的文件夹 最后,它将在创建的同一文件夹中分割文件。 此循环应遍历文件夹中存在的所有大文件。 我的代码如下:

import glob
import os
os.chdir("/test code/")
lines_per_file = 106
sf = None
for file in glob.glob("*.TAB"):
    with open(file) as bigfile:
        for lineno, line in enumerate(bigfile):
            if lineno % lines_per_file == 0:
                if sf:
                    sf.close()
                    sf_filename = '/test code/201511_sst/sf_{}.txt'.format(lineno + lines_per_file)
                    sf = open(sf_filename, "w")
                    sf.write(line)
                    if sf:
                        sf.close()

我得到如下输出:

In [35]: runfile('/test code/file_loop_16Jan.py', wdir='/test code')
In [36]:

我需要一些关于循环文件的指导,以便我可以实现它。我认为没有错误意味着我错过了一些东西! 请任何人都可以帮助我!

【问题讨论】:

  • *.txt 输出文件中是否写入了任何内容?
  • 你设置了 sf = None 并且不要在 if sf 行之间修改它,所以最后几行永远不会被调用。
  • 第一次循环,sf是真还是假?
  • 1) 是的,大文件必须在大文件的每 106 行之后拆分并放入 sf_{} 文件中。
  • 2) 正如我所提到的,我想一次循环所有大文件,然后拆分它。新文件(sf_{} 命名)将保存在大文件名称的文件夹中。我正在努力的那个循环!哎呀!

标签: python loops filenames


【解决方案1】:

sf 在开始时设置为None,因此您永远不会进入if sf 循环:任何地方都不会写入输出文件。

另外,当你关闭文件时,你必须再次将sf设置为None,否则再次关闭时你会得到“对关闭文件的操作”。

但这不会做你想要的。您要拆分文件,请执行以下操作:

        if lineno % lines_per_file == 0:
            # new file, close previous file if any
            if sf:
                sf.close()
            # open new file
            sf_filename = '/test code/201511_sst/sf_{}.txt'.format(lineno + lines_per_file)
            sf = open(sf_filename, "w")
        # write the line in the current handler
        sf.write(line)
  • 在开始时遇到第一个if:好。由于sfNone,它不会调用close(最好)
  • 然后使用新文件名打开文件
  • 现在该行已写入新文件句柄中(您必须在每次迭代时写入一行,不仅在模匹配时)

在下一次迭代中,当模数匹配时,关闭前一个文件,并使用新文件名创建一个新句柄。

退出循环时别忘了关闭最后一个文件句柄:

if sf:
    sf.close()

我还没有测试过,但逻辑在这里。如果您有后续问题,请发表评论,我会编辑我的帖子。

另外:另一个问题是如果有超过 1 个大的*.TAB 文件,分割的文件将被覆盖。为了避免这种情况,我会在输出文件中添加输入文件基本名称(例如,lineno 在每个循环中都会重置):

sf_filename = '/test code/201511_sst/{}_sf_{}.txt'.format(os.path.splitext(os.path.basename(file))[0]),lineno + lines_per_file)

您也可以通过存储结尾 lineno 并计算行偏移来做到这一点。这取决于你

【讨论】:

    【解决方案2】:

    由于您已经使用 with 语句来读取文件,因此您也可以将其用于写入文件,这样您就不需要显式关闭文件对象。查看这些链接。

    https://docs.python.org/2/reference/compound_stmts.html#with https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

    你可以这样做:

    with open(file,"w") as sf:
        // read/write file content and do your stuff here
    

    【讨论】:

    • 即使经过修改,也没有任何结果!我一直在寻找替代方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2016-12-18
    相关资源
    最近更新 更多