アミールA.シャバニ:
私は、そのスクリプトを持って、私は複数回実行されますが、このスクリプトの主な機能の最初の行は次のようなものです:
def main():
users_csv_file_init()
何この関数はやるべきことは、このようなファイルが存在しない場合は、CSVファイルを作成し、列の名前を追加することであり、それがない場合、それは何もしないはずです。私が書いたことは、このでした:
def users_csv_file_init():
with open("users.csv", 'a+') as output_file:
writer = csv.writer(output_file)
writer.writerow(["userid", "username", "fname", "lname", "uuid"])
それは新しい行(列の名前)私は、スクリプトを実行するたびに、作成しているので、それは、理にかなっているので、これは、失敗しa+
、それが存在し、追加モードで開いていない場合は、ファイルを作成します。しかし、私はに変更することはできませんw+
それはファイルで以前にいたすべてのものが削除されるため、どちらか。そして、のモードの中からopen()
、唯一w+
とa+
思われるが存在しない場合は、ファイルを作成します。
ファイルが存在する場合、私は手動でこのように、チェックすることができます:
def users_csv_file_init():
if not os.path.exists("users.csv"):
with open("users.csv", 'w') as output_file:
writer = csv.writer(output_file)
writer.writerow(["userid", "username", "fname", "lname", "uuid"])
しかし、私は聞いています、それはこのようにそれを行うには競合状態にunpythonicとなりやすいのです。どのように私はそれを正しく行うことができますか?
どのように:
あなただけのキャッチできるFileExistsError
と排他作成モードでファイルを開いてみてください。
ファイルがすでに存在する場合は失敗し、排他的な作成のために開きます
def users_csv_file_init():
try:
with open("users.csv", 'x') as output_file:
writer = csv.writer(output_file)
writer.writerow(["userid", "username", "fname", "lname", "uuid"])
except FileExistsError:
pass