【问题标题】:Updating a saved csv更新保存的 csv
【发布时间】:2014-12-02 23:51:40
【问题描述】:

我正在尝试将一些数据保存到我保存到 csv 文件中的字典中。唯一的问题是我想永久保存 csv 文件,以便以后重新启动程序时可以重新使用它。例如,如果我输入一些数据,它将显示 dict 已更新,csv 文件也已更新(如果我用 excel 打开 csv 文件,它将显示输入)。但是当我关闭程序并重新启动它并提供一些新的输入时,它将重置 dict 和 csv 数据。如何保留数据并仅更新文件? 这是我的代码,这里的 cmets 并不重要。

# Writing
import csv

with open("inkomsten.csv", "r") as f:
    reader = csv.reader(f, delimiter=":")

# Dicts van de data
inkomsten = {}
uitgaven = {}

##############################

目前只关注“Inkomsten”。

# Inkomsten updaten
def toevoegenIn():
    bron = str(raw_input("Welke bron wilt U toevoegen? "))
    bedrag = int(input("Welk bedrag hoort daarbij? "))
    inkomsten[bron] = bedrag

# Uitgaven updaten
def toevoegenUit(bron, bedrag):
    uitgaven[bron] = bedrag

##############################

# Totaal bedragen updaten
def totaalIn():
    waarde = inkomsten.values()
    totaal = 0
    for i in waarde:
        totaal += i
    print totaal

def totaalUit():
    waarde = uitgaven.values()
    totaal= 0
    for i in waarde:
        totaal += i
    print totaal

##############################

toevoegenIn()
print inkomsten
totaalIn()

with open("inkomsten.csv", "wb") as g:
    writer = csv.writer(g, delimiter=":")
    writer.writerows(inkomsten.items())

【问题讨论】:

  • 那些文件很大吗?它们适合记忆吗?另外,您能否发布一个 2-3 行 .csv 的示例?
  • 现在,它们不超过 20 字节,因为我只用 1 个输入对其进行了测试。一个例子是 -> AH : 250 一排。它将在新行上打印每个新输入
  • 我也在尝试将第一个和第二个输入分成两个不同的列,但那是另一次了 ;)
  • 那些 .csv... 他们总是只有两列吗?像AH:250? (如果是这种情况,这可以通过dict 轻松完成)否则,它会比这更复杂一些。

标签: python python-2.7 csv


【解决方案1】:

要将新数据附加到现有文件,您需要在打开文件时将访问模式从“wb”更改为“ab”。

查看关于阅读文件here 的教程点页面,在打开功能 部分下有一个表格,其中包含不同的可用选项。我知道该示例未使用 csv 模块,但它们似乎可以工作,并且我过去曾使用过其中一些,例如“ab”。

【讨论】:

    【解决方案2】:

    让我们在这里做几个重要的假设...如果他们错了,请给我留言,我会尝试编辑我的答案以使其更适合您的问题。

    假设如下:

    • 文件中的数据看起来像<key: value> 结构。这种结构非常适合 python dict
      • 这隐含意味着keys(左列的项目)在文件中不能出现多次
    • 您的文件将足够小,可以完全加载到内存中。

    考虑到这些限制,您可以这样做(代码中的 cmets 和一些额外的 print 语句用于调试目的)

    import csv
    
    
    def toevoegenIn():
        bron = str(raw_input("Welke bron wilt U toevoegen? "))
        bedrag = int(input("Welk bedrag hoort daarbij? "))
        return {bron: bedrag}
    
    if __name__ == '__main__':
        # Step 1: Load all the data in a dictionary. The cells might come with
        #         undesired extra spaces in them. Use strip to remove those.
        loaded_data = {}
        with open('test.csv', 'r') as csv_file_r:
            reader = csv.reader(csv_file_r, delimiter=':')
            loaded_data = {}
            for row in reader:
                loaded_data[row[0].strip()] = int(row[1].strip())
    
        print "Initial data: %s" % loaded_data
        # Step 2: Ask the user what data to change.
        #         The toevoegenIn function will return a 
        #         one-key dictionary.
        change_data = toevoegenIn()
        # Step 3: Use dict.update to update your initial data with the
        #         dict retrieved above.
        #         If the modified key already existed in the original dict,
        #         it will be modified to the value entered by the user.
        #         If the key wasn't in the original dict, it'll be added.
        loaded_data.update(change_data)
        print "Updated data: %s" % loaded_data
    
        # Step 4: Write the new data. I put it into a new file, just 
        #         in case you don't wanna overwrite the original one. If
        #         you do want to overwrite, just change the file's name to
        #         the original file.
        with open('test.csv.new', 'w') as csv_file_w:
            writer = csv.writer(csv_file_w, delimiter=':')
            for key, val in loaded_data.items():
                writer.writerow([key, val])
    
        # Make a quick confirmation read:
        with open('test.csv.new', 'r') as f:
            print "new_contents:\n%s" % f.read()
    

    哪些输出:

    Initial data: {'BD': 69, 'AH': 250, 'BC': 100}
    Welke bron wilt U toevoegen? BC
    Welk bedrag hoort daarbij? 150
    Updated data: {'BD': 69, 'AH': 250, 'BC': 150}
    new_contents:
    BD:69
    AH:250
    BC:150
    

    【讨论】:

    • 哦,我什至不知道你能做到这一点,但这真的很有帮助。谢谢!
    • 如果我的答案解决了您的问题,您应该考虑将其选为“已选答案”(答案左侧的绿色勾号)。它会帮助将来找到这个问题的人,它会给你代表,它会给我代表,它会鼓励其他人在未来回答你的问题(系统地不选择答案的 OP不是很好......感知)双赢! (进一步参考:meta.stackexchange.com/questions/5234/…
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2022-01-22
    • 2021-01-08
    • 2011-04-03
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多