将单个值更改/写入csv文件python

将单个值更改/写入csv文件python,python,csv,python-3.x,export-to-csv,Python,Csv,Python 3.x,Export To Csv,我的代码中有一个错误: _csv.Error: sequence expected 我相信这是因为我试图只写一个值,而不是一个列表等等 exRtFile = open ('exchangeRate.csv') exchReader = csv.reader(exRtFile) exchWriter = csv.writer(exRtFile) loop2=0 while loop2==0: selected=int(input("Please

我的代码中有一个错误:

_csv.Error: sequence expected
我相信这是因为我试图只写一个值,而不是一个列表等等

 exRtFile = open ('exchangeRate.csv')
    exchReader = csv.reader(exRtFile)
    exchWriter = csv.writer(exRtFile)
    loop2=0
    while loop2==0:
        selected=int(input("Please select an option: "))
        if selected == 1:
            change = input("What rate would you like to change: ")
            changeRt = float(input("What would you like to change the rate to: "))
            for row in exchReader:
                currency = row[0]
                if currency == change:
                    crntRt = row[1]
                    crntRt = changeRt
                    exchWriter.writerow(crntRt)
                    exRtFile.close()
解决此问题的最佳方法是什么,或者是否有更好的方法更改CSV文件中的值

csv文件:

Pound Sterling,1
Euro,1.22
US Dollar,1.67
Japanese Yen,169.948

回答您的问题:是的,问题是您试图只写一个值,而
writerow
需要一个列表

也就是说。。。你会考虑改变你的代码的工作方式吗?< /P> 以下是我所做的(我现在已经测试过了,所以我知道它是有效的):

  • 首先,要求用户进行所有更改,并将其保存在
    dict
    中,其中键是货币名称(例如欧元),值是新货币值(例如5.0)。用户可以按
    0
  • 其次,逐行打开并阅读您的
    exchangeRate.csv
    文件。如果要更改的值中有
    行[0]
    (货币名称),则在该行中更改它
  • 无论发生什么情况(无论行是否需要更改),都将该行写入新的临时文件
    exchangeRate.csv.tmp
  • 读取原始文件中的所有行后,您将拥有
    exchangeRate.csv.tmp
    ,其中一些行未更改,一些行已更改。将
    .tmp
    文件交换(移动)到
    exchangeRate.csv
不知道。。。可能是太多的变化了吧?不管怎样,这就是:

import csv
import shutil

change_rates = {}
selected = 1
while selected:
    selected=int(raw_input("Please select an option: (1 to change, 0 to exit)"))
    if selected == 1:
        change = raw_input("What rate would you like to change?: ")
        changeRt = float(raw_input("What would you like to change the rate to: "))
        change_rates[change] =  changeRt

if len(change_rates) > 0:
    with open('exchangeRate.csv', 'r') as f_in,\
        open('exchangeRate.csv.tmp', 'w') as f_out:
        exchReader = csv.reader(f_in)
        exchWriter = csv.writer(f_out)
        for row in exchReader:
            if row[0] in change_rates:
                row[1] = change_rates[row[0]]
            exchWriter.writerow(row)
    shutil.move('exchangeRate.csv.tmp', 'exchangeRate.csv')
下面是一个执行示例:

Please select an option: (1 to change, 0 to exit)1
What rate would you like to change?: Euro
What would you like to change the rate to: 5
Please select an option: (1 to change, 0 to exit)0

borrajax@borrajax:~/Documents/Tests$ cat ./exchangeRate.csv 
Pound Sterling,1
Euro,5.0
US Dollar,1.67
Japanese Yen,169.948 
您总是可以进行更多优化,例如。。。允许不区分大小写的搜索,或者检查货币是否已实际更改(例如,即使用户说他想将货币欧元更改为5.0,如果这是欧元的汇率,则不要做任何事情)。。。诸如此类的事情

编辑1

我刚刚看过Larry Lustig的,我同意,对于小文件(您可以在内存中完全加载的文件),我发布的磁盘的连续读写不是最优的。他将所有内容都保存在内存中,然后对同一
exchangeRate.csv
文件进行批量写入的想法可能更适合您的需要

编辑2

要在对此答案的评论中回答您的问题,请执行以下操作:

  • .tmp在:exchangeRate.csv.tmp结尾做什么:

    这只是个新名字。我添加后缀
    .tmp
    ,以避免与原始文件(exchangeRate.csv)的命名冲突。不过,您可以随意命名它(甚至
    foobar.baz

  • 变量“变更”的目的是什么:变更率[变更]=变更率:

    change
    是一个包含要更改的货币名称的变量(在我发布的使用示例中,
    change
    包含字符串
    “Euro”
    ,因为这是用户(erm…me)在控制台上键入的。这只是访问

  • “[row[0]]”在:row1=变更率[row[0]]中的位置是什么

    我们同意在读取文件时,
    行[0]
    (就像这样,而不是
    [row[0]]
    )包含文件中的货币名称(欧元、英镑……等等),对吗?因此在执行的某个点,
    行[0]
    将包含字符串
    “Euro”
    ,它(在我的测试示例中)是用户想要更改的货币。该字符串(
    “Euro”
    )也是
    更改费率
    字典中的一个键(因为用户说他想更改它),因此您要查询
    更改费率
    字典中带有键的项目的值(这将为您提供
    5.0
    )。正在做
    change\u rates[“Euro”]
    ,为了看得更清楚,请在
    print“货币”行中添加要更改的货币:%s”%change\u rates
    ,如果len(change\u rates)>0:(这将向您展示字典的外观)

  • shutil.move('exchangeRate.csv.tmp','exchangeRate.csv')做什么

    它使用新货币将文件复制到
    exchangeRate.csv
    (请参阅)


    • 回答您的问题:是的,问题是您试图只写一个值,而
      writerow
      需要一个列表

      ……你会考虑改变你的代码工作方式吗?

      以下是我所做的(我现在已经测试过了,所以我知道它是有效的):

      • 首先,要求用户进行所有更改,并将其保存在
        dict
        中,其中键是货币名称(例如欧元),值是新货币值(例如5.0)。用户可以按
        0
      • 其次,逐行打开并读取您的
        exchangeRate.csv
        文件。如果
        行[0]
        (货币名称)是要更改的值之一,则在该行中更改它
      • 无论发生什么情况(无论行是否需要更改),都将该行写入新的临时文件
        exchangeRate.csv.tmp
      • 读取原始文件中的所有行后,您将拥有
        exchangeRate.csv.tmp
        ,其中一些行未更改,一些行已更改。将
        .tmp
        文件交换(移动)到
        exchangeRate.csv
      不知道……可能是太多的变化了吧?不管怎样,这就是:

      import csv
      import shutil
      
      change_rates = {}
      selected = 1
      while selected:
          selected=int(raw_input("Please select an option: (1 to change, 0 to exit)"))
          if selected == 1:
              change = raw_input("What rate would you like to change?: ")
              changeRt = float(raw_input("What would you like to change the rate to: "))
              change_rates[change] =  changeRt
      
      if len(change_rates) > 0:
          with open('exchangeRate.csv', 'r') as f_in,\
              open('exchangeRate.csv.tmp', 'w') as f_out:
              exchReader = csv.reader(f_in)
              exchWriter = csv.writer(f_out)
              for row in exchReader:
                  if row[0] in change_rates:
                      row[1] = change_rates[row[0]]
                  exchWriter.writerow(row)
          shutil.move('exchangeRate.csv.tmp', 'exchangeRate.csv')
      
      下面是一个执行示例:

      Please select an option: (1 to change, 0 to exit)1
      What rate would you like to change?: Euro
      What would you like to change the rate to: 5
      Please select an option: (1 to change, 0 to exit)0
      
      borrajax@borrajax:~/Documents/Tests$ cat ./exchangeRate.csv 
      Pound Sterling,1
      Euro,5.0
      US Dollar,1.67
      Japanese Yen,169.948 
      
      您总是可以进行更多优化,例如…允许不区分大小写的搜索,或者检查货币是否已实际更改(例如,即使用户说他想将货币欧元更改为5.0,如果这是欧元的汇率,则不要执行任何操作)…诸如此类的事情

      编辑1

      我刚刚看过Larry Lustig的,我同意对于小文件(可以完全加载到内存中的文件)来说,从磁盘进行连续读写