【问题标题】:renaming the header when using dictreader使用 dictreader 时重命名标题
【发布时间】:2016-05-22 00:19:04
【问题描述】:

我正在寻找使用 dictreader / dictwriter 重命名标题的最佳方法,以添加到我已经完成的其他步骤中。

这就是我试图对下面的源数据示例做的事情。

  1. 删除前 2 行
  2. 与源文件相比,将列(标题和数据)重新排序为 2、1、3
  3. 将标题重命名为 ASXCode、CompanyName、GISC

当我在时

如果我使用'reader = csv.reader.inf',第一行将被删除,列重新排序,但正如预期的那样,没有标题重命名

当我运行 dictreader 行 'reader = csv.DictReader(inf, fieldnames=('ASXCode', 'CompanyName', 'GICS'))' 时,我收到错误消息 'dict contains fields not in fieldnames:' 和显示第一行数据而不是标题。

我对如何解决这个问题有点困惑,所以任何提示都值得赞赏。

源数据示例

ASX listed companies as at Mon May 16 17:01:04 EST 2016     

Company name    ASX code    GICS industry group
1-PAGE LIMITED  1PG Software & Services
1300 SMILES LIMITED ONT Health Care Equipment & Services
1ST AVAILABLE LTD   1ST Health Care Equipment & Services

我的代码

import csv
import urllib.request
from itertools import islice

local_filename = "C:\\myfile.csv"
url = ('http://mysite/afile.csv')

temp_filename, headers = urllib.request.urlretrieve(url)

with open(temp_filename, 'r', newline='') as inf, \
        open(local_filename, 'w', newline='') as outf:

  #  reader = csv.DictReader(inf, fieldnames=('ASXCode', 'CompanyName', 'GICS'))
    reader = csv.reader(inf)
    fieldnames = ['ASX code', 'Company name', 'GICS industry group']  
    writer = csv.DictWriter(outf, fieldnames=fieldnames)

# 1. Remove top 2 rows
    next(islice(reader, 2, 2), None)

# 2. Reorder Columns
    writer.writeheader()  
    for row in csv.DictReader(inf):
        writer.writerow(row)        

【问题讨论】:

  • 请提供一个简短的完整程序来演示该问题。请包括样本输入以及实际和预期的输出。请包括任何错误消息的全文。请参阅minimal reproducible example 了解更多信息。

标签: python csv header


【解决方案1】:

这里的IIUC是一个使用pandas及其函数read_csv的解决方案:

import pandas as pd
#Considering that you have your data in a file called 'stock.txt' 
#and it is tab separated, by default the blank lines are not read by read_csv, 
#hence set the header=1
df = pd.read_csv('stock.txt', sep='\t',header=1)
#Rename the columns as required
df.columns= ['CompanyName', 'ASXCode', 'GICS']
#Reorder the columns as required
df = df[['ASXCode','CompanyName','GICS']]

这就是您在 ipython 中的操作方式,输出如下所示:

【讨论】:

    【解决方案2】:

    根据您的提示,我最终成功了。我之前没有使用过熊猫,所以必须先做好准备。

    我最终发现 pandas 使用了一个数据框,所以我不得不对 tocsv 函数做一些不同的事情,并最终在 tocsv 函数中添加 index=False 参数以删除 df 索引。

    现在非常感谢。

    import csv
    import os
    import urllib.request
    import pandas as pd
    
    local_filename = "C:\\myfile.csv"
    
    url = ('http://mysite/afile.csv')
    
    temp_filename, headers = urllib.request.urlretrieve(url)
    
    #using pandas dataframe
    df = pd.read_csv(temp_filename, sep=',',header=1) #skip header
    df.columns = ['CompanyName', 'ASXCode', 'GICS'] #rename columns
    df = df[['ASXCode','CompanyName','GICS']] #reorder columns
    
    df.to_csv(local_filename, sep=',', index=False)
    os.remove(temp_filename)  # clean up
    

    【讨论】:

      猜你喜欢
      • 2016-05-05
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 2023-01-02
      • 2017-06-03
      相关资源
      最近更新 更多