什么';这是更新Python CSV的一种故障安全方法

什么';这是更新Python CSV的一种故障安全方法,python,csv,Python,Csv,这是我在python csv中构建用户执行操作记录的函数。它将从全局获取用户名,并将amount参数中给定的增量执行到csv的特定位置,匹配用户的行和当前日期 简而言之,该函数将读取列表中的csv,并在将整个列表重新写入csv文件之前对数据进行任何修改 行中的每个第一项都是用户名,标题中有日期 Accs\Dates,12/25/2016,12/26/2016,12/27/2016 user1,217,338,653 user2,261,0,34 user3,0,140,455 然而,我不知道为

这是我在python csv中构建用户执行操作记录的函数。它将从全局获取用户名,并将
amount
参数中给定的增量执行到csv的特定位置,匹配用户的行和当前日期

简而言之,该函数将读取列表中的csv,并在将整个列表重新写入csv文件之前对数据进行任何修改

行中的每个第一项都是用户名,标题中有日期

Accs\Dates,12/25/2016,12/26/2016,12/27/2016
user1,217,338,653
user2,261,0,34
user3,0,140,455
然而,我不知道为什么有时候,头get被下推到第二行,数据崩溃时会被完全删除

另外,我需要指出,可能有多个脚本运行此函数并在同一个文件上写入,但不确定这是否导致了问题

我在想,也许我可以为每个用户单独编写统计数据,并在以后合并,从而消除编写时可能出现的冲突。虽然如果我能从这里改进,读/写文件中的所有内容,那就太好了

有没有安全的方法来做我在这里要做的事

# Search current user in first rows and updating the count on the column (today's date)
# 'amount' will be added to the respective position
def dailyStats(self, amount, code = None):
    def initStats():
        # prepping table
        with open(self.stats, 'r') as f:
            reader = csv.reader(f)
            for row in reader:
                if row:
                    self.statsTable.append(row)
                    self.statsNames.append(row[0])

    def getIndex(list, match):
        # get the index of the matched date or user
        for i, j in enumerate(list):
            if j == match:
                return i

    self.statsTable = []
    self.statsNames = []
    self.statsDates = None

    initStats()
    today = datetime.datetime.now().strftime('%m/%d/%Y')
    user_index = None
    today_index = None

    # append header if the csv is empty
    if len(self.statsTable) == 0:
        self.statsTable.append([r'Accs\Dates'])
        # rebuild updated table
        initStats()

    # add new user/date if not found in first row/column
    self.statsDates = self.statsTable[0]
    if getIndex(self.statsNames, self.username) is None:
        self.statsTable.append([self.username])
    if getIndex(self.statsDates, today) is None:
        self.statsDates.append(today)

    # rebuild statsNames after table appended
    self.statsNames = []
    for row in self.statsTable:
        self.statsNames.append(row[0])

    # getting the index of user (row) and date (column)
    user_index = getIndex(self.statsNames, self.username)
    today_index = getIndex(self.statsDates, today)

    # the row where user is matched, if there are previous dates than today which
    # has no data, append 0 (e.g. user1,0,0,0,) until the column where today's date is match
    if len(self.statsTable[user_index]) < today_index + 1:
        for i in range(0,today_index + 1 - len(self.statsTable[user_index])):
            self.statsTable[user_index].append(0)

    # insert pv or tb code if found
    if code is None:
        self.statsTable[user_index][today_index] = amount + int(re.match(r'\b\d+?\b', str(self.statsTable[user_index][today_index])).group(0))
    else:
        self.statsTable[user_index][today_index] = str(re.match(r'\b\d+?\b', str(self.statsTable[user_index][today_index])).group(0)) + ' - ' + code

    # Writing final table
    with open(self.stats, 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerows(self.statsTable)

    # return the summation of the user's total count
    total_follow = 0
    for i in range(1, len(self.statsTable[user_index])):
        total_follow += int(re.match(r'\b\d+?\b', str(self.statsTable[user_index][i])).group(0))

    return total_follow
#在第一行搜索当前用户并更新列上的计数(今天的日期)
#“金额”将添加到相应的位置
def dailyStats(自身、金额、代码=无):
def initStats():
#准备台
将open(self.stats,'r')作为f:
读卡器=csv。读卡器(f)
对于读取器中的行:
如果行:
self.statsTable.append(行)
self.statsNames.append(第[0]行)
def getIndex(列表,匹配):
#获取匹配日期或用户的索引
对于枚举中的i,j(列表):
如果j==匹配:
返回i
self.statsTable=[]
self.statsNames=[]
self.statsDates=无
initStats()
今天=datetime.datetime.now().strftime(“%m/%d/%Y”)
用户索引=无
今日指数=无
#如果csv为空,则追加标题
如果len(self.statsTable)==0:
self.statsTable.append([r'Accs\Dates']))
#重新生成更新的表
initStats()
#如果在第一行/列中找不到新用户/日期,则添加新用户/日期
self.statsDates=self.statsTable[0]
如果getIndex(self.statsNames,self.username)为无:
self.statsTable.append([self.username])
如果getIndex(self.statsDates,今天)为无:
self.statsDates.append(今天)
#在追加表后重新生成statsNames
self.statsNames=[]
对于self.statsTable中的行:
self.statsNames.append(第[0]行)
#获取用户(行)和日期(列)的索引
user\u index=getIndex(self.statsNames、self.username)
今天_index=getIndex(self.statsDates,今天)
#匹配用户的行,如果有比今天更早的日期
#如果没有数据,则追加0(例如user1,0,0,0),直到与今天的日期匹配的列
如果len(self.statsTable[user_index])
另外,我需要指出,可能有多个脚本运行此函数并在同一个文件上写入,但不确定这是否导致了问题

很可能这正是你的问题。当两个东西试图同时写入同一个文件时,来自两个源的输出很容易混淆在一起,导致文件充满了胡言乱语

解决这个问题的一个简单方法就是您在问题中提到的,让每个不同的进程(或线程)写入自己的文件,然后使用单独的代码最终合并所有这些文件。我可能会这么做

如果您不想这样做,您可以让不同的进程/线程将其信息发送到“聚合器进程”,该进程将所有内容放在一起,并将其写入文件-关键是只有聚合器才会写入文件。当然,要做到这一点,需要内置一些进程间通信(IPC)方法,而这反过来可能会很棘手,具体取决于您是如何做到的。实际上,为简单程序实现IPC的最佳方法之一是使用临时文件,这与上一段中的内容相同

另外,我需要指出,可能有多个脚本运行此函数并在同一个文件上写入,但不确定这是否导致了问题

很可能这正是你的问题。当两个东西试图同时写入同一个文件时,来自两个源的输出很容易混淆在一起,导致文件充满了胡言乱语

解决这个问题的一个简单方法就是您在问题中提到的,让每个不同的进程(或线程)写入自己的文件,然后使用单独的代码最终合并所有这些文件。我可能会这么做

如果您不想这样做,您可以让不同的进程/线程将其信息发送到“聚合器进程”,该进程将所有内容放在一起,并将其写入文件-关键是只有聚合器才会写入文件。当然,这样做