【问题标题】:How to rename and move files from different directories to one common directory?如何将文件从不同目录重命名和移动到一个公共目录?
【发布时间】:2016-11-18 16:31:48
【问题描述】:

给定以下目录结构:

dir/2012-01-01/employee.csv.bz2
dir/2012-01-02/employee.csv.bz2
dir/2012-01-03/employee.csv.bz2
dir/2012-01-04/employee.csv.bz2
dir/2012-01-05/employee.csv.bz2

我想将扩展名从 csv.bz2 重命名为 .csv 并仅将扩展名为 .csv 的文件移动到新文件夹:

dir/all_files

我尝试过的是以下内容,它可以重命名但不会将文件移动到新方向:

path = 'dir/'
os.mkdir('dir/all_files')

extensions = ('.csv')
for folderName, subfolders, filenames in os.walk(path):
    for filename in filenames:
       ext = os.path.splitext(filename)[-1].lower()
        if ext in extensions:
           infilename = os.path.join(folderName, filename)
           newname = os.path.join('dir', 'all_files',  filename.replace('.csv.bz2', '.csv'))
           output = os.rename(infilename, newname)

只移动第一个条目并导致错误:

output = os.rename(infilename, newname)
FileExistsError: [WinError 183] Cannot create a file when that file already   exists: 'dir/2012-01-01\\employee.csv.bz2' -> 'dir/all_files\\employee.csv'

这当然是有道理的,因为我想移动所有标记为 employee.csv 的文件。

我的问题是如何将这些文件移动到all_files

【问题讨论】:

  • 您当前的工作目录是什么?也就是Python实例运行的目录?您在dir/ 中的所有目录是否都以2012- 开头?
  • 你需要给他们单独的名字,可能基于他们所在的目录,因为你不能在一个目录中有多个employee.csv文件。
  • 嗨,是的,dir/2012 开头,但可能很快会更改为 2013 :)。 python 正在运行/usr/bin/python,当os.getcwd() 时,当前工作目录为/home/myname/。我试图通过在newname 上附加毫秒来给出唯一的名称,但它仍然会带来错误。我想我必须附加一种序列。我的python知识到此结束。
  • employee.csv.bz2 你的意思是[Tom, Dick, Harry].csv.bz2,对吧?还是和你说的完全一样?在这种情况下,如果我们改名为Date-employee.csv.bz2 可以吗,其中 Date 可以是 2012-01-01, 2012-01-02, ...?
  • 每个目录是否只包含一个employee.csv.bz2 文件?

标签: python file file-handling


【解决方案1】:

您的问题是您将所有文件都放在同一个目录中,并且它们都具有相同的名称。您可以根据它们的第一个文件夹的名称重命名它们。这段代码应该可以工作:

import os

path = 'dir/'
os.mkdir('dir/all_files')

extensions = ['.csv']
for folder, _, filenames in os.walk(path):
    for filename in filenames:
        if folder == path or folder == os.path.join(path, 'all_files'):
            continue
        folder = folder.strip(path)
        extension = os.path.splitext(os.path.splitext(filename)[0])[-1].lower()
        if extension in extensions:
            infilename = os.path.join(path, folder, filename)
            newname = os.path.join(path, 'all_files', "{}-{}".format(folder.strip('./'), filename.replace('.csv.bz2', '.csv')))
            os.rename(infilename, newname)

【讨论】:

  • 嗨,斯坦,谢谢你的解决方案。所有文件都必须在同一个文件夹中。不确定这里是否是这种情况
  • 那么你希望他们的名字是什么?可能是2012-01-01-employee.csv 等?
  • 是的,那太好了
  • 嗨,斯坦,太酷了,谢谢!但是,zip(subfolders, filename): 来自哪里? for subfolder, filename in zip(subfolders, filename): NameError: name 'filename' is not defined
  • 我的错应该是filenames而不是filename
【解决方案2】:

如果您在问题中所说的一切都是正确的,那么以下将是您问题的直接解决方案:

import os
import re

path = 'dir/'

# os.mkdir(path+'all_files')
os.system('ls '+path+' > '+path+'dirList.txt');

with open(path+'dirList.txt') as f:
    for line in f:
        if re.match('[1-9]',line):
            os.system('mv '+path+line.strip()+'/employee.csv.bz2 '
                      +path+'all_files/'+line.strip()+'-employee.csv')

os.system('rm '+path+'dirList.txt') # Optional delete the temporary file

我模拟了您的问题陈述并验证了上面的代码,它特定于基于 Unix 和 Linux 的操作系统,例如 Mac 和 Ubuntu。

【讨论】:

  • 将字符串加在一起是不好的做法,而且由于命令存在于 python 中,因此使用 linux 的终端也没有意义
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 2019-09-26
  • 1970-01-01
  • 2017-07-20
  • 2023-04-07
  • 2014-12-19
  • 1970-01-01
  • 2012-02-26
相关资源
最近更新 更多