【问题标题】:Python - Reading the contents of csv in python and appending itPython - 在 python 中读取 csv 的内容并附加它
【发布时间】:2019-03-01 03:49:34
【问题描述】:
 import csv
 with open("somecities.csv") as f:
    reader = csv.DictReader(f)
    data = [r for r in reader]

somecities.csv 的内容:

Country,Capital,CountryPop,AreaSqKm

Canada,Ottawa,35151728,9984670

USA,Washington DC,323127513,9833520

Japan,Tokyo,126740000,377972

Luxembourg,Luxembourg City,576249,2586

python 新手,我正在尝试读取并附加一个 csv 文件。我花了一些时间尝试对类似问题的一些回答,但没有运气——这就是为什么我认为上面的代码毫无用处。

我本质上想要实现的是使用字典将 CSV 中的每一行存储在内存中,国家名称作为键,值是包含表中其他信息的元组,按照它们在CSV 文件。

从那里我尝试将另外三个城市添加到 csv(国家、首都、CountryPop、AreaSqKm)并查看更新的 csv。我应该如何去做这一切?

对更新后的 csv 的期望添加是:

巴西,巴西利亚,211224219, 8358140

中国,北京,1403500365, 9388211

比利时,布鲁塞尔,11250000, 30528

编辑:

Import csv
with open("somecities.csv", "r") as csvinput:
    with open(" somecities_update.csv", "w") as csvresult:
        writer = csv.writer(csvresult, lineterminator='\n')
        reader = csv.reader(csvinput)
        all = []
        headers = next(reader)
        for row in reader:
            all.append(row)

        # Now we write to the new file
        writer.write(headers)
        for record in all:
            writer.write(record)


        #row.append(Brazil, Brasília, 211224219, 8358140)
        #row.append(China, Beijing, 1403500365, 9388211)
        #row.append(Belgium, Brussels, 11250000, 30528)

【问题讨论】:

  • 您可以探索最适合的python pandas。
  • 您没有使用 pandas 数据框有什么原因吗?如果你这样做,我可能会这样做。再说一次,也许有理由不这样做?
  • data = {r[0]: tuple(r[1:]) for r in reader}?还是我误解了?您不需要为此使用DictReader,您需要常规的csv.reader()
  • @roganjosh 我已经按照你的建议做了,但我现在遇到了 AttributeError: module 'csv' has no attribute 'reader'。
  • 你能添加想要的输出吗?

标签: python csv dictionary append tuples


【解决方案1】:

DictReader 只会将每一行表示为字典,例如:

{
  "Country": "Canada",
  ...,
  "AreaSqKm": "9984670"
}

如果要将整个 CSV 存储为字典,则必须创建自己的:

import csv

all_data = {}

with open("somecities.csv", "r") as f:
    reader = csv.DictReader(f)
    for row in reader:
        # Key = country, values = tuple containing the rest of the data.
        all_data[row["Country"]] = (row["Capital"], row["CountryPop"], row["AreaSqKm"])

# Add the new cities to the dictionary here...

# To write the data to a new CSV
with open("newcities.csv", "w") as f:
    writer = csv.writer(f)
    for key, values in all_data.items():
        writer.writerow([key] + list(values))

不过,正如其他人所说,pandas 库可能是一个不错的选择。查看它的 read_csvto_csv 函数。

【讨论】:

  • 我在使用您提出的代码时遇到的一个问题是 AttributeError:模块 'csv' 没有属性 'DictReader'。你知道为什么会这样吗?
  • 不知道你为什么会遇到这个问题。在最坏的情况下,您可以使用标准 csv.reader,记住行现在将表示为列表。因此,在初始循环中,您将改用 all_data[row[0]] = tuple(row[1:]) 之类的东西。
【解决方案2】:

因此,假设您可以为此使用 pandas,我会这样做:

import pandas as pd   

df1 = pd.read_csv('your_initial_file.csv', index_col='Country')
df2 = pd.read_csv('your_second_file.csv', index_col='Country')

dfs = [df1,df2]

final_df = pd.concat(dfs)

【讨论】:

    【解决方案3】:

    通过如下的列表构造创建和列出并附加新值的另一个想法,未经测试:

    import csv
    with open("somecities.csv", "r") as csvinput:
        with open("result.csv", "w") as csvresult:
            writer = csv.writer(csvresult, lineterminator='\n')
            reader = csv.reader(csvinput)
            all = []
            row = next(reader)
            row.append(Brazil, Brasília, 211224219, 8358140)
            row.append(China, Beijing, 1403500365, 9388211)
            all.append(row)
            for row in reader:
                row.append(row[0])
                all.append(row)
            writer.writerows(all)
    

    我看到的最简单的Form,在python 3.6中测试过

    使用 'a' 参数打开文件允许您追加到文件末尾,而不是简单地覆盖现有内容。试试看。

    >>> with open("somecities.csv", "a") as fd:
    ...     fd.write("Brazil, Brasília, 211224219, 8358140")
    

    #!/usr/bin/python3.6
    import csv
    fields=['Brazil', 'Brasília', '211224219','8358140']
    with open(r'somecities.csv', 'a') as f:
        writer = csv.writer(f)
        writer.writerow(fields)
    

    【讨论】:

    • 这在尝试使用建议的代码批次时变得越来越常见:我遇到了 AttributeError:模块 'csv' 没有属性 'writer'。你对我应该如何解决这个问题有什么建议吗?
    • @TheIllusiveNick,您使用的是哪个版本的 python 以及什么操作系统风格?但是,可能在您的代码中您有一个变量名csv = something? 不要尝试将模块名称用作变量或脚本名称,这是大多数时候的问题。
    • 一个潜在的问题可能是我也在使用 python 3.6 解释器?
    • python 3.6 有 writer 功能,所以应该没问题。
    • @TheIllusiveNick 我已经根据您的问题在 cmets 中提出了建议。你没有回复我。
    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2019-10-04
    • 2022-01-04
    相关资源
    最近更新 更多