2017-02-10 22 views
0

私が実行するたびにフォルダのバックアップを作成するショートプログラムをコーディングしようとしています。私はエラーを取得しかしファイルをコピーするとSyntaxErrorはバイトをデコードできません

import time 
import shutil 
import os 

date = time.strftime("%d-%m-%Y") 
print(date) 

shutil.copy2("C:\Users\joaop\Desktop\VanillaServer\world","C:\Users\joaop\Desktop\VanillaServer\Backups") 

for filename in os.listdir("C:\Users\joaop\Desktop\VanillaServer\Backups"): 
    if filename == world: 
     os.rename(filename, "Backup " + date) 

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape 

を、私はなぜ(マニュアルに従って、私は自分のコードが正しく書かれていると思う)

を把握することはできません現在、それはこのようなものですどのように私はこれを修正することができます/より良い方法でそれを行うには?

+2

おそらく、バックスラッシュをエスケープするか、生の文字列を使用する必要があります: ' "C:\\ユーザー..."'や 'R "C:\ユーザー..."' –

+1

を...またはスラッシュを使用します。 – cdarke

+0

[unicode error]の重複している可能性があります 'unicodeescape'コーデックは2-3位のバイトをデコードできません:切り詰められた\ UXXXXXXXXエスケープ](http://stackoverflow.com/questions/37400974/unicode-error-unicodeescape-codec-デコード・バイト・イン・ポジション・2-3トリンク) –

答えて

0

スラッシュはエスケープ文字に使用されています。

生の文字列を使用するか、ファイルパスを二重にすることで、インタペクタがエスケープシーケンスを無視するように、2つの方法があります。生の文字列を指定するには、r、または\\を使用します。あなたが使う選択はあなた次第ですが、個人的には生の弦を好きです。

#with raw strings 
shutil.copy2(r"C:\Users\joaop\Desktop\VanillaServer\world",r"C:\Users\joaop\Desktop\VanillaServer\Backups") 

for filename in os.listdir(r"C:\Users\joaop\Desktop\VanillaServer\Backups"): 
    if filename == world: 
     os.rename(filename, "Backup " + date) 

#with double slashes 
shutil.copy2("C:\\Users\\joaop\\Desktop\\VanillaServer\\world","C:\\Users\\joaop\\Desktop\\VanillaServer\\Backups") 

for filename in os.listdir("C:\\Users\\joaop\\Desktop\\VanillaServer\\Backups"): 
    if filename == world: 
     os.rename(filename, "Backup " + date) 
2

Pythonでは、\u...はUnicodeシーケンスを表しているため、\UsersディレクトリはUnicode文字として解釈されます。大した成功はありません。それを修正する

>>> "\u0061" 
'a' 
>>> "\users" 
    File "<stdin>", line 1 
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX escape 

、あなたは\\など、さまざま\をエスケープするか、または生の文字列を作るためにr"..."を使用する必要があります。

>>> "C:\\Users\\joaop\\Desktop\\VanillaServer\\world" 
'C:\\Users\\joaop\\Desktop\\VanillaServer\\world' 
>>> r"C:\Users\joaop\Desktop\VanillaServer\world" 
'C:\\Users\\joaop\\Desktop\\VanillaServer\\world' 

は、しかし、両方をしない、または他の彼らは二回エスケープされます。

>>> r"C:\\Users\\joaop\\Desktop\\VanillaServer\\world" 
'C:\\\\Users\\\\joaop\\\\Desktop\\\\VanillaServer\\\\world' 

あなただけのソースに直接パスを入力するときにそれらをエスケープする必要があります。ファイルから、ユーザー入力から、またはライブラリ関数からこれらのパスを読み取ると、それらのパスは自動的にエスケープされます。インタプリタは、それが(新しい行のための\nとタブの\tのようなものです)エスケープ文字としてそれらを使用しようとするファイルのパス文字列で\を見ているので、とき

関連する問題