Python 为什么会覆盖用户';在我的csv文件中输入的以前的数据?
这是我的代码:Python 为什么会覆盖用户';在我的csv文件中输入的以前的数据?,python,python-3.x,csv,Python,Python 3.x,Csv,这是我的代码: class CSV: def __init__(self, path, hdrs): self.path = path # raw string path; i.e. using r"/path/to/file" self.headers = hdrs # list of strings ['Username', 'Password'] self.created = False def create(self): wi
class CSV:
def __init__(self, path, hdrs):
self.path = path # raw string path; i.e. using r"/path/to/file"
self.headers = hdrs # list of strings ['Username', 'Password']
self.created = False
def create(self):
with open(self.path, 'w', newline='') as f:
w = csv.writer(f, delimiter=',')
w.writerow(self.headers)
self.created = True
return self.headers
def read(self):
with open(self.path, 'r', newline='') as f:
r = csv.reader(f, delimiter=',')
rows = list(r)
return rows
def write(self, data): # list of strings ['Username', 'Password']
if not self.created:
rows = [self.create()] # create list of lists
else:
rows = self.read() # this is a list of lists by default
rows.append(data)
with open(self.path, 'w', newline='') as f:
w = csv.writer(f, delimiter=',')
w.writerows(rows)
def register():
print ("Your username will now be created from your first name and age.")
fname = input("Please enter your first name: ")
age = input("Please enter your age: ")
fname2 = fname[:3]
username = fname2 + age
print ("Your username is {}".format(username.upper()))
password = input("Please enter a password for your new account: ")
time.sleep(1.0)
print ("Username: {}".format(username))
print ("Password: {}".format(password))
myCSV = CSV('/Users/Sidd/Desktop/python/Coursework/UserPass.csv', ['Username', 'Password'])
new = [username, password]
myCSV.write(new)
在第一段代码中,它在我的csv文件中创建用户名和密码头
在第二段代码中,它将用户的用户名和密码写入标题下方的csv文件中。但是当另一个用户输入另一个用户名和密码时,它会覆盖以前的用户名和密码,而不是低于csv文件中以前的用户名和密码
我怎样才能解决这个问题?
谢谢。它正在覆盖它,因为每次新用户出现时,您都会用调用第一个
我不太喜欢文件I/O上的'a'
方法。我见过太多的读/写损坏。因此,为什么不:
- 只创建一次文档(因此忽略反复调用
DictWriter
)
- 阅读内容并存储它
- 附加新内容并覆盖
试一试,在我编写的Python 3.6.2上测试!(减去'/path/to/file'
)
另外,在我的writer.writerow(…)中,我如何编写它,使用户名写在头用户名下面,密码写在头密码下面?您总是意外地运行这两个块吗?它们都是分开的。第一个块首先运行并创建标题,然后关闭文件。秒块重新打开文件以追加数据。那么,这很简单。当您再次使用
调用第一个时,您将使用'w'
打开它,这将截断文件,从而删除其中的所有内容。如果您是第一次创建文件,则只应使用第一个块,当您将新数据添加到现有文件中时,则不会如此。@SiddharthChaudhary那么您没有向我们展示您的完整实现。如前所述,此代码不会覆盖CSV中已经存在的内容。啊,抱歉,在我显示之前,用户注册了一个新帐户,在该帐户中用户输入了新的用户名和密码。然后,该用户名和密码将被获取并存储在csv文件中。但我的问题是,当另一个用户创建新帐户时,他们的用户名和密码会覆盖第一个用户的用户名和密码password@SiddharthChaudhary我提供给您的这段代码在提供新用户名和密码组合时不会覆盖它。例如,在我的示例中,new
列表将是User#1;new2
将是用户2。两个用户最终都正确地进入CSV。这是你自己的事情。@SiddharthChaudhary我建议你在原来的帖子中展示你的全部代码(如果你选择使用我的代码,请用我的代码更新),这样我们就可以看到发生了什么。@SiddharthChaudhary我已经看到了一个问题。为什么类
在def寄存器()中?
import csv
class CSV:
def __init__(self, path, hdrs):
self.path = path # raw string path; i.e. using r"/path/to/file"
self.headers = hdrs # list of strings ['Username', 'Password']
self.created = False
def create(self):
with open(self.path, 'w', newline = '') as f:
w = csv.writer(f, delimiter = ',')
w.writerow(self.headers)
self.created = True
return self.headers
def read(self):
with open(self.path, 'r', newline = '') as f:
r = csv.reader(f, delimiter = ',')
rows = list(r)
return rows
def write(self, data): # list of strings ['Username', 'Password']
if not self.created:
rows = [self.create()] # create list of lists
else:
rows = self.read() # this is a list of lists by default
rows.append(data)
with open(self.path, 'w', newline = '') as f:
w = csv.writer(f, delimiter = ',')
w.writerows(rows)
def register(fin):
print ("Your username will now be created from your first name and age.")
name = input("Please enter your first name: ")
age = input("Please enter your age: ")
name2 = name[:3].upper()
username = name2 + age
print ("Your username is", username)
password = input("Please enter a password for your new account: ")
time.sleep(1.0)
print ("Username:", username)
print ("Password:", password)
fin.write([username, password])
myCSV = CSV('/path/to/file', ['Username', 'Password'])
register(myCSV) # fill in with some values
register(myCSV) # fill in with some newer values