繁体   English   中英

Python:如何将 CSV 中除一列之外的所有列转换为整数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM