将单个值更改/写入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>
以下是我所做的(我现在已经测试过了,所以我知道它是有效的):
- 首先,要求用户进行所有更改,并将其保存在
中,其中键是货币名称(例如欧元),值是新货币值(例如5.0)。用户可以按dict
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结尾做什么:
这只是个新名字。我添加后缀
,以避免与原始文件(exchangeRate.csv)的命名冲突。不过,您可以随意命名它(甚至.tmp
)foobar.baz
- 变量“变更”的目的是什么:变更率[变更]=变更率:
是一个包含要更改的货币名称的变量(在我发布的使用示例中,change
包含字符串change
,因为这是用户(erm…me)在控制台上键入的。这只是访问“Euro”
- “[row[0]]”在:row1=变更率[row[0]]中的位置是什么
我们同意在读取文件时,
(就像这样,而不是行[0]
)包含文件中的货币名称(欧元、英镑……等等),对吗?因此在执行的某个点,[row[0]]
将包含字符串行[0]
,它(在我的测试示例中)是用户想要更改的货币。该字符串(“Euro”
)也是“Euro”
字典中的一个键(因为用户说他想更改它),因此您要查询更改费率
字典中带有键的项目的值(这将为您提供更改费率
)。正在做5.0
,为了看得更清楚,请在change\u rates[“Euro”]
,如果len(change\u rates)>0:(这将向您展示字典的外观)print“货币”行中添加要更改的货币:%s”%change\u rates
- shutil.move('exchangeRate.csv.tmp','exchangeRate.csv')做什么
它使用新货币将文件复制到
(请参阅)exchangeRate.csv
- 回答您的问题:是的,问题是您试图只写一个值,而
writerow
需要一个列表
……你会考虑改变你的代码工作方式吗?
以下是我所做的(我现在已经测试过了,所以我知道它是有效的):- 首先,要求用户进行所有更改,并将其保存在
中,其中键是货币名称(例如欧元),值是新货币值(例如5.0)。用户可以按dict
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的,我同意对于小文件(可以完全加载到内存中的文件)来说,从磁盘进行连续读写