2016-04-06 8 views
-3

は、私は以下に示すのスレッドを読んできました:Python:部分的なファイル名を保持したり変更する方法は?

Renaming filenames using python

Replacing Filename characters with python

しかし、彼らは私が探しています正確に何ではありません。

私がここで達成しようとしているのは、ファイルをExcelからCSVに変換しながらファイルの名前を変更することです。私の変換コードは機能しますが、出力ファイル名に不要な単語を取り除きたいと思っています。

のは、私のファイル名があるとしましょう: "Great_day_2015-1-14.xlsx"

、 "Sample_file_2016-4-30.xlsx"、 "Hello_world_2014-5-30.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"

基本的には、最初の単語を「ボーナス」のような特定の単語に置き換えたいと考えています。

+0

'new_name.replace( 'サンプル'、 'おまけ')' – Djizeus

+0

投稿する前に、いくつかの研究を行うください... – Djizeus

+0

HIこの例には合っていますが、どうすればよりダイナミックにすることができますか?ファイルが同じ文字列 "Sample"で始まらない場合はどうすればよいですか? – alwaysaskingquestions

答えて

1

固定インデックスに基づいてスライスしたり、既知の部分文字列を置換するのに十分な柔軟性がない場合は、regular expressionsにする必要があります。それ自体は広大でかなり複雑なテーマですが、本質的には文字列を検索するために使用できるミニプログラムです。

具体的なケースでは、たとえば、次の正規表現を使用できます。\d{4}-\d{1,2}-\d{1,2}$。これは、意味:

  • \d{4}:4桁、
  • -:ダッシュが続く、
  • \d{1,2}
  • :ダッシュが続く、
  • \d{1,2}:1又は2桁、
  • -続い:1桁または2桁の後に、
  • $:文字列の最後に続けます。

あなたはこのようにそれを使用します:5月あなたの答え@Djizeus

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

ああありがとう!これはまさに私が必要なものです!だから、あなたは本当にばかげた質問だと思うのですが、まずコンパイル()を使うのはなぜですか? – alwaysaskingquestions

+0

これは愚かな質問ではありません:)実際はあなたは必要ありません、ショートカット 'res = re.search(r '\ d {4} - \ d {1,2} - \ d {1,2 } $ '、ファイル名) '。私はそれを習慣からやったのですが、コンパイルは同じ正規表現を複数回使用する場合にのみ有効です。コンパイルすると、プログラムは式を1回だけ解析し、時間を節約します。 C.f。 Pythonのドキュメントを参照してください。 – Djizeus

+0

さて、私はそれを今理解しています!これは変数/オブジェクトとして保存するようなものです。次に、すべての詳細を入力せずに繰り返し使用できます。どうもありがとうございます! – alwaysaskingquestions