2016-04-06 30 views
-3

我已经通过如下所示的线程读取:Python:如何保留和/或修改部分文件名?

Renaming filenames using python

Replacing Filename characters with python

但他们不正是我所期待的。

我在这里想要完成的是重命名文件,同时将它们从Excel转换为csv。我的转换代码工作,但我也想摆脱我的输出文件名称中不必要的单词。

比方说,我的文件名是:

“Sample_file_2016-4-30.xlsx”, “Hello_world_2014-5-30.xlsx”, “Great_day_2015-1-14.xlsx”

我希望我的输出是(数字前的所有字符将被删除):

“2016-4-30.csv”, “2014-5-30.csv”,“2015-1 -14.csv“

这就是我已经做(和代码工作):

def xslx_to_csv(): 
    files = os.listdir(r"~\files to be converted") 
    current_path = os.getcwd() 
    os.chdir(r"~\files to be converted") 

    for file in files: 
     print file 
     filename = os.path.splitext(file)[0] 

     wb = xlrd.open_workbook(file) 
     sh = wb.sheet_by_index(0) 
     new_ext = 'csv' 
     new_name = (filename, new_ext) 
     csvfile = open(".".join(new_name), 'wb') 
     wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL) 

     for rownum in xrange(sh.nrows): 
      wr.writerow(sh.row_values(rownum)) 

     csvfile.close() 

然而,这个代码只给我的输出如下:

“Sample_file_2016-4-30。 CSV”, “Hello_world_2014-5-30.csv”, “Great_day_2015-1-14.csv”

我试过到目前为止: 我试过使用os.rename()str.replace()(正如Djizeus所建议的),我也尝试使用静态字符串位置,例如:new_name[14:35]来获取部分名称。

但我需要一个更动态的方法。如何识别和删除yyyy-mm-dd格式的数字之前的所有字符?

奖金的问题: 我想借此远一点,而不是只去除文件名中多余的部分,我不知道如何可以改变文件名。例如,在这种情况下,所期望的输出可以是:

“Bonus_file_2016-4-30.csv”, “Bonus_file_2014-5-30.csv”, “Bonus_file_2015-1-14.csv”

所以基本上,我想用“Bonus”这个特定的词来代替开头的单词。

+0

'new_name.replace( '样品', '奖金')' – Djizeus

+0

请做一些研究,然后再发布... – Djizeus

+0

喜@Djizeus你的答案可能适合这个例子,但我怎样才能使它更加动态?如果我的文件不以相同的字符串“Sample”开头会怎么样? – alwaysaskingquestions

回答

1

当基于固定索引或替换已知子串的切片不够灵活以满足您的需求时,您必须求助于regular expressions。它本身是一个庞大且相当复杂的主题,本质上它们是可以用来搜索字符串的小程序。

在你的具体情况下,你可以使用例如这个正则表达式:\d{4}-\d{1,2}-\d{1,2}$。这意味着:

  • \d{4}:4个位数,
  • -:后跟一个破折号,
  • \d{1,2}:随后用1或2位,
  • -:后跟一个破折号,
  • \d{1,2} :后跟1或2位数字,
  • $:后面跟着字符串的结尾。

你会使用这样的:

import re 

# Compile the regular expression 
# r'' is to give a raw string and avoid escaping \ characters 
prog = re.compile(r'\d{4}-\d{1,2}-\d{1,2}$') 

#Search the regular expression in filename 
res = prog.search(filename) 

#This gives you the start position of the date 
#(assuming all filenames end with a date) 
date_start = res.start() 
new_name = 'Bonus_file_%s.csv' % filename[date_start:] 
+0

啊非常感谢你!!!这正是我需要的!所以一个侧面的问题,如果你认为它是一个非常愚蠢的问题,你不必回答我,但为什么先使用compile()呢? – alwaysaskingquestions

+0

这不是一个愚蠢的问题:)其实你不需要,你也可以使用快捷方式'res = re.search(r'\ d {4} - \ d {1,2} - \ d {1,2 } $',filename)'。我习惯于这样做,但编译仅在您要多次使用同一个正则表达式时才有用。通过编译它,您的程序只会解析表达式一次,从而节省时间。 C.F. Python文档获取更多细节。 – Djizeus

+0

好吧,我现在明白了!这就像将它首先保存为一个变量/对象,然后您可以反复使用它,而无需输入所有的细节。非常感谢! – alwaysaskingquestions