我是编程和python的新手,这是我决定尝试解决的第一个程序。
这循环遍历我运行它的目录中的文件,并取出我不想要的文本字符串,并留下我想要的文件名(理论上)。
这一切都有效,除了我遇到的问题是我无法弄清楚如何从我的循环中获取os.rename
(我认为这是我需要使用的)。
我已经阅读了它,但我想我只是不知道怎么把它绑起来。 我正在使用python 2.7。 这是我到目前为止所得到的:
import os
file_count = 0
for files in os.listdir('.'): #Open for loop in the current dir.
if files.find('_The_Hype_Machine_') and files.endswith('.128.mp3') :
mod_list = list(files) #Turns filenames into a list so they can be edited
del(mod_list[-38:-4]) #specifies the piece of string I need taken out of each filename.
files =''.join(mod_list) #Turns the list back to a string
file_count += 1
updated_file = files.replace('_', ' ')
os.rename(files, **"not sure what goes here"**)
print updated_file
print 'Your modifed MP3 File Count: ', file_count;
我可以使用某个方向并帮助理解是否有人为此而努力。 提前谢谢。
答案 0 :(得分:1)
我对你的程序进行了一些调整,并用教学评论对其进行了注释:
import os
# Each time through the following loop, "afile" will take on the next file name
# also we can use "enumerate" to give us a file_count as we go (instead
# of tracking the count separately)
# In general, we shouldn't change a list we're iterating over, so we'll save it off
file_list = os.listdir('.') # (as sk4x0r mentioned)
for file_count, afile in enumerate(file_list): #Open for loop in the current dir.
# using the 'some_string' in some_text is more typical python useage
if '_The_Hype_Machine_' in afile and afile.endswith('.128.mp3'):
# Now, strings are immutable, so we can't exactly remove the
# inside of a string
# What we can do is create a brand new string composed
# of everything we want to keep
new_name = afile[:-38] + afile[-4:]
updated_file = new_name.replace('_', ' ')
os.rename(afile, updated_file)
print updated_file
print 'Your modifed MP3 File Count: ', file_count
答案 1 :(得分:0)
从您的代码看,变量* updated_file *似乎包含该文件的新名称。 如果你对你正在生成的文件的新名称没问题,你可以这样做:
os.rename(files, updated_file)
另请注意您的支票
if files.find('_The_Hype_Machine_') and files.endswith('.128.mp3') :
可能无法正常工作。 files.find 调用在找到子字符串的字符串和子字符串索引时找不到子字符串时返回-1。因此,最好将上述条件重写为:
if files.find('_The_Hype_Machine_')!= -1 and files.endswith('.128.mp3') :
如果你选择一个不同于“文件”的变量名称会更好:
for my_file in os.listdir('.'):
使用文件作为变量名称给人的印象是它引用了 os.listdir 返回的所有文件,因为它只是用于单个文件名的名称当前的迭代。
答案 2 :(得分:0)
在您的代码中,如果os.rename
以上的所有内容都正常,那么os.rename(files, updated_file)
应该会给出预期的结果。但一般来说,在迭代它时更新列表的内容并不安全。因此,通过对代码进行一些修改,我可以想出这段代码:
import os
file_count=0
files=os.listdir('.')
for f in files:
if f.find('_The_Hype_Machine_') and f.endswith('.128.mp3'):
f2=f[:-38] #cuts last 38 characters from filename including extension .mp3
f2=f2.replace('-','_')
os.rename(f,f2) #I guess, f2+'.mp3' should be more correct
file_count+=1