![](/img/trans.png)
[英]How do I fix this program that adds up all the integers in a list except the one that equals said sum?
[英]Python: how do I convert all columns except one in a CSV to integers
我有具有不同列数的 CSV 文件。 第一列始终是字符串,其他列始终是整数。
第一列始终是“名称”,但其他列可以有不同的名称 - 所以我不能硬编码除“名称”之外的任何列的键值。
理想情况下,会有某种语法/函数允许我!"name" to int
,然后我可以将一些东西放在一起。
这就是我现在所拥有的,它不会转换为 int,它只是构建一个字典。
import csv
persons = []
database_csv = sys.argv[1]
with open(database_csv, "r") as database:
read_csv = csv.DictReader(database)
for row in read_csv:
persons.append(row)
我找到了将所有转换为 int、将键(例如“name”)转换为 int 的解决方案,但我找不到任何可以让我将除“name”之外的所有内容转换为 int 的东西。
请注意,我使用的是字典,而不是列表。 列表的解决方案在下游并不直接有用。 如果没有可行的解决方案可以在不诉诸 pandas 的情况下选择性地更改字典中的数据类型,那么我将需要重新考虑字典方法并弄清楚如何使代码的 rest 工作。
我不知道您是否听说过 pandas。 但是你可以使用以下
import pandas as pd
df = pd.read_csv(database_csv)
persons = df.values.tolist()
希望这可以帮助,
import csv
persons = []
with open("database.csv", "r") as database:
read_csv = csv.DictReader(database)
for row in read_csv:
# Type decl does nothing.
row: dict
print(row.keys())
for key in row.keys():
print(row[key])
这行得通吗?
import csv
with open(database_csv) as fp:
csvreader = csv.reader(fp)
headers = next(csvreader)
name_idx = headers.index('name')
rows = [row for row in csvreader]
rows = [int(value) for value in row for row in rows if row.index(value) != name_idx]
要转换字典中的每个值,除了一个特定的键,你可以做
converted = {k: (v if k == 'name' else int(v)) for k, v in row.items()}
让我们把它分开:
{k: v for k, v in... }
— 这是一个dict 理解,它让我们可以迭代某些东西并从结果中构建一个 dict。 在这种情况下,我们期望 ... 是对的序列,我们使用k, v
构造将它们分成两个变量。v if k=='name' else int(v)
— 我们使用条件表达式来决定,对于每个项目,如何处理它 — 保持原样或调用int()
。row.items())
——这给了我们row
字典的每个元素作为(键,值)对,这就是我们在第一点所说的我们所期望的。(如果你有几个想要保持不变的键,你可以这样做
excluded = set(['name', 'address', 'preferred_colour'])
然后if k in excluded_set
而不是if k=='name'
) )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.