0

我对 python 编程还是新手,但我有一个很好的小工具可以在工作中使用。我编写的原始代码将进入 csv 文件,并将某些列设置为列表。该代码正在运行,如下所示:

with open('profiles.csv', 'r') as f:
    reader = csv.reader(f)
    for column in reader:
        numbers.append(column[0])
del numbers[0]
with open('profiles.csv', 'r') as f:
    reader = csv.reader(f)
    for column in reader:
        devlist.append(column[0])        
del devlist[0]

随着我对函数越来越熟悉,我决定自己清理代码,但是这段代码不起作用:

def getInfo(keyword, columnvar):
    with open('profiles.csv', 'r') as f:
        reader = csv.reader(f)
        for column in reader:
            '%s'.append(column['%s']) % (keyword, columnvar)
        del '%s'['%s'] % (keyword, columnvar)
getInfo(numbers, 0)
getInfo(devlist, 0)    

我不明白问题是什么,因为我完全复制了原始代码的格式。如果我不在 %s 周围加上引号,我会得到

    %s.append(column[%s]) % (keyword, columnvar)
    ^
SyntaxError: invalid syntax

但是,如果我添加引号,我会得到

    del '%s'['%s'] % (keyword, columnvar)
SyntaxError: can't delete operator

任何帮助,将不胜感激。

4

3 回答 3

1

您不能用同名的字符串替换对象。这是一个您出错的简单示例:

>>> l = [1,2] # a list
>>> l.append(3) # append an item; succeeds
>>> '%s'.append(4) % l
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'append'

l 是一个列表对象,但是当你尝试做类似的事情时'%s'%l,它变成了一个字符串对象。

于 2013-11-12T14:50:47.410 回答
0

我认为您对运营商有些误解%。它只是格式化一个字符串(顺便说一句,你应该使用str.format它)。你在这里尝试做的是格式化字符串,然后eval()是它(这是一个不好的做法!)。

你想要一个正确的语法是:

for column in reader:
    keyword.append(column[columnvar])
del keyword[columnvar]
于 2013-11-12T14:51:02.030 回答
0

我不明白问题是什么,因为我完全复制了原始代码的格式

该代码在语法上无效。Python 非常动态,但不是那么动态。请注意,有一种方法可以使它变得动态,但这并不是您应该在这里做的。

但是,如果我添加引号...

这也不是有效的语法。' %s' 和其他替换仅在strings 内起作用,并且任意strings 不会作为程序的一部分执行。Python 对整个程序的文本进行词法分析(在执行/导入时)。您选择的语法无效。

关于:

del numbers[0]
del devlist[0]

...我们正在清理,在这里,是吗?让我们试试csv这里的功能。 Sniffer可以告诉你是否有标题行。并且DictReader可以允许您通过标题列的名称来索引这些字段。这样你就可以完全跳过这一点。

于 2013-11-12T14:52:44.030 回答