在Python 2中打印带有字符串和插入变量的随机csv单元格
我是一个python noob,所以请对我轻松一下。
我有一个示例csv文件(实际的csv文件有20行和2列类似于下面显示的内容):
"I hate %s" % x, "I am a %s" % x
"I heart %s" % x, "I am not a %s" % x
我的Python 2.7脚本:
from csv import *
x = "gorillas"
with open('csv_test.csv', 'rU') as csvfile:
spamreader = reader(csvfile, quoting = QUOTE_MINIMAL)
list = []
for row in spamreader:
list.append(row[0])
print list[1]
csvfile.close()
我想我的脚本打印:
I heart gorillas
而是它正在打印:
"I heart %s" % x
所以,我的变量x不会被插入到我的字符串中。 我假设我的问题是,当我从我的csv中提取单元格的内容时,整个单元格内容被视为一个字符串。 但是,我不知道如何解决这个问题。
作为奖励或后续,我还想从我的csv文件中选择一个随机单元格。
谢谢您的帮助。
一种选择可能是让csv文件被解释为字符串格式的代码行。 这将要求您将字符串解释为脚本的一部分。 你可以用eval()来做到这一点
print eval(list[1])
应该这样做。
根据你的应用程序,eval可能很有用,但通常我不会推荐从某处读取输入,然后使用eval运行这些内容。 考虑用户在网站上发布文本的思想实验。 如果帖子包含有效的Python代码,他们刚刚获得了在您的机器上运行自己的脚本的权限。
相反,你可以替换部分字符串。 然后松开'%x'格式说明符
from csv import *
x = "gorillas"
with open('csv_test.csv', 'rU') as csvfile:
spamreader = reader(csvfile, quoting = QUOTE_MINIMAL)
list = []
for row in spamreader:
list.append(row[0])
print list[1].replace("%s", x)
csvfile.close()
你可以使用eval来做到这一点:
from csv import *
x = "gorillas"
with open('csv_test.csv', 'rU') as csvfile:
spamreader = reader(csvfile, quoting = QUOTE_MINIMAL)
list = []
for row in spamreader:
list.append(eval(row[0]))
print list[1]
csvfile.close()
我在运行代码时看到两个问题 -
你没有在你的reader
设置QUOTE_NONE
的引用,导致csv阅读器不能替换双引号(至少它不在我的机器中),QUOTE_MINIMAL(在我的机器上,Python 3.4和Python 2.7)它是替换完整的双引号,并且在list
中没有双引号。
打印字符串时,必须评估表达式并使用eval()
函数打印它。
代码看起来像 -
>>> with open('csv_test.csv', 'rU') as csvfile:
... spamreader = reader(csvfile, quoting = QUOTE_NONE)
... list = []
... for row in spamreader:
... list.append(row[0])
...
>>> print(eval(list[1]))
I heart gorillas
我只是使用|
因为它不会出现在你的csv例子中,你可以使用任何东西。
请注意,它不是一种好的做法,可以将这些声明保留在csv中,然后使用eval
在函数中对它们进行eval
因为它们可以将任何内容写入csv,并且可能会导致程序出现潜在的问题。
上一篇: Printing a random csv cell with string and inserted variable in Python 2