2017-11-14 10 views
0

私は奇妙な行動、以下の顔を行いますPythonの文字列は変更さ

paths = [item for item in glob.glob('./01_data/**/**') if '.xlsx' in item] 

私はファイルパスをループを実行します。

paths =['./01_data\\2017-04-12 yy\\data.xlsx', './01_data\\2017-05-01 dd\\data.xlsx', './01_data\\2016-11-18 xx\\data.xlsx', './01_data\\2017-10-11 dd\\data.xlsx'] 

私のデータファイルへのパスはによって生成されていますそれから日付を抽出したい:

# date measured 
re_date = re.compile(r'\d{4}-\d{2}-\d{2}') 

作業を何:

dates = [] 
for i in len(paths): 
    match = re_date.search(paths[i]) 
    if match: 
     dates.append(match.group()) 

私はパスが変更され、\\がに変換され、列挙を使用する場合:と

for item, file in enumerate(paths): 
    print(file) 

./01_data\2017-04-12 yy\data.xlsx 
./01_data\2017-05-01 dd\data.xlsx 
./01_data\2016-11-18 xx\data.xlsx 
./01_data\2017-10-11 dd\data.xlsx 

同じ動作:欠落しているので

for file in paths: 
    print(file) 

./01_data\2017-04-12 yy\data.xlsx 
./01_data\2017-05-01 dd\data.xlsx 
./01_data\2016-11-18 xx\data.xlsx 
./01_data\2017-10-11 dd\data.xlsx 

正規表現は、これらの文字列では動作しません。 '\\'。リストの反復が '\\'を '\'に変更する理由は何ですか?コードを変更するのは大したことではありませんが、エラーの原因を見つけるまでにはかなり時間がかかりました。

+0

なぜあなたはに投票しますこの質問を閉じる? Pythonの列挙関数とその文字列を変更する理由についての正当な質問です。 – Moritz

+0

正規表現が一致しないコードは表示されていません。 –

+0

あなたは正しいです、私はそれをチェックしたはずです。そのエラーはどこか別の場所で発生しました。私は閉会することにしました。 1 left – Moritz

答えて

3

文字列は変更されていません。列挙せずにパスをループして文字列を印刷すると、同じことが表示されます。これは、文字列のstr()(単一のバックスラッシュ、囲み引​​用符なし)と文字列のrepr()の印字(二重バックスラッシュ、囲み引​​用符付き)の違いです。

>>> s = './01_data\\2017-04-12 yy\\data.xlsx' 
>>> print(repr(s)) 
'./01_data\\2017-04-12 yy\\data.xlsx' 
>>> print(str(s)) 
./01_data\2017-04-12 yy\data.xlsx 
0

これはenumerate()機能とは関係ありません。文字列を二重のバックスラッシュで印刷しています。バックスラッシュをエスケープするような印刷が理解されている場合はダブルバックスラッシュを使用します。そのため、この結果が得られます。 列挙しないと、同じ結果が得られます。

for file in paths: 
    print(file) 
+0

ああ、ありがとう – Moritz

0

期待どおりに動作します...

dates = [] 
for item, file in enumerate(paths): 
    match = re_date.search(file) 
    if match: 
     dates.append(match.group()) 
print(dates) 

プリント:

['2017-04-12', '2017-05-01', '2016-11-18', '2017-10-11'] 

文字と生の文字列をエスケープについて詳しく読む:

>>> print("\\") 
\ 
>>> print(r"\\") 
\\ 
関連する問題