【问题标题】:Iterate through a list of files and copy them using python遍历文件列表并使用 python 复制它们
【发布时间】:2013-07-23 14:39:17
【问题描述】:

我想创建一个函数,该函数将遍历列表到我输入的文件名,然后当满足条件时,我希望它将每个后续文件复制到名为“INPUT”的文件中。

这是我目前所拥有的:

file_list = [file1, file2, file3]
def queue():
    if condition1_met:
        for item in file_list:
            os.system('cp item INPUT')
        else:
            return queue()

但是我只是不知道最好的方法是迭代然后复制文件,因为那个 os.system 位不会识别“项目”。

【问题讨论】:

  • 将每个项目复制到INPUT 意味着它们都替换了以前的版本。只有最后一个这样的副本会保留。
  • 是的,这就是我想要的,但我确实想保留原始文件。
  • 为什么,您使用 os.system() 进行此操作?完全在 python 中处理文件对象不够吗?
  • 我不认为你想要在 for 之后的 else 子句。它会一直运行(因为 for 循环中没有中断),因此 queue() 将继续调用自身并复制文件,直到 python 达到其递归限制。你真的想在这个函数中回避吗?

标签: python loops copy


【解决方案1】:

你必须替换:

os.system('cp item INPUT')

作者:

os.system('cp %s INPUT' % item)

因此项迭代器的值被替换为字符串并作为操作系统调用执行。

根据评论编辑:

最好用shutil:

shutil.copyfile(item, 'INPUT')

这样就不需要替换了。

【讨论】:

  • 这些操作请使用shutil
  • @Jan-PhilipGehrcke 根据您的评论编辑答案。
【解决方案2】:

这段代码会将每个文件复制到INPUT,每次都会覆盖INPUT:

import shutil

file_list = [file1, file2, file3]
def queue():
  if condition1_met:
    for item in file_list:
      shutil.copyfile(item, "INPUT")
    else:
      return queue()

如果您想将文件的内容附加到 INPUT,那么这应该可以完成工作:

python 2.6 版本

import contextlib

file_list = [file1, file2, file3]
def queue():
  if condition1_met:
    for item in file_list:
      with contextlib.nested(open(item,"r"), open("INPUT","a+")) as (src,dst):
        dst.writelines(src.readlines())
    else:
      return queue()

python 2.7 版本

file_list = [file1, file2, file3]
def queue():
  if condition1_met:
    for item in file_list:
      with open(item,"r"), open("INPUT","a+") as src,dst:
        dst.writelines(src.readlines())
    else:
      return queue()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多