【发布时间】:2020-05-29 14:37:25
【问题描述】:
我有一个我会运行多次的脚本,这个脚本的main函数的第一行是这样的:
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()、only w+ and a+ seem的模式中创建文件,如果文件不存在。
我可以手动检查文件是否存在,如下所示:
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"])
但是I'm told 这样做是不合 Python 的并且容易出现竞争条件。我怎样才能正确地做到这一点?
【问题讨论】:
-
除非你实施一些锁,否则你总是会得到加注条件。就我而言,这是最好的方法。
-
你应该接受 Sayse 的回答而不是我的。假设所有打开文件的脚本都这样做,它可以避免竞争条件,因为独占模式是原子的。
标签: python