如何重命名文件并将其从不同目录移动到一个公共目录?
How to rename and move files from different directories to one common directory?
给定以下目录结构:
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
?
您的问题是您将所有文件都放在同一个目录中,并且它们都具有相同的名称。您可以根据第一个文件夹的名称重命名它们。此代码应该有效:
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)
如果您在问题中陈述的一切都是真实的,那么以下将是您问题的直接解决方案:
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 和 [=19] =].
给定以下目录结构:
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
?
您的问题是您将所有文件都放在同一个目录中,并且它们都具有相同的名称。您可以根据第一个文件夹的名称重命名它们。此代码应该有效:
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)
如果您在问题中陈述的一切都是真实的,那么以下将是您问题的直接解决方案:
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 和 [=19] =].