【问题标题】:how to choose which column to write in (.csv) in python如何在python中选择要写入(.csv)的列
【发布时间】:2016-02-21 20:26:42
【问题描述】:
import csv

f = csv.reader(open('lmt.csv','r'))         # open input file for reading
Date, Open, Hihh, mLow, Close, Volume = zip(*f)    #s plit it into separate columns

ofile = open("MYFILEnew1.csv", "wb")            # output csv file
c = csv.writer(ofile)

item = Date   
item2 = Volume
rows = zip(item, item)
i = 0
for row in item2:
    print row
    writer = csv.writer(ofile, delimiter='\t')
    writer.writerow([row])

ofile.close() 

以上是我目前制作的。

正如您在第 3 行中看到的,我从电子表格中提取了 6 列。 我想创建一个名为MYFILEnew1.csv 的.csv 文件,它只有两列,DateVolume

我上面创建的 .csv 仅将 Volume 列写入新 .csv 文件的第一列。 如何将Date 放入第二列?

例如

Date       Open   High      Low     Close    Volume
17-Feb-16   210   212.97    209.1   212.74  1237731

是我所拥有的。并且我想生成一个新的 csv 文件,使其具有

Date           Volume
17-Feb-16      1237731

【问题讨论】:

    标签: python python-2.7 csv


    【解决方案1】:

    如果我正确理解您的问题,您可以使用 panda 的 read_csvto_csv 轻松实现这一点(@downvoter:请您解释一下您的反对意见!?);您的问题的最终解决方案可以在下面找到EDIT2

    import pandas as pd
    
    # this assumes that your file is comma separated
    # if it is e.g. tab separated you should use pd.read_csv('data.csv', sep = '\t')
    df = pd.read_csv('data.csv')
    
    # select desired columns
    df = df[['Date', 'Volume']]
    
    #write to the file (tab separated)
    df.to_csv('MYFILEnew1.csv', sep='\t', index=False)
    

    所以,如果您的 data.csv 文件如下所示:

    Date,Open,Hihh,mLow,Close,Volume
    1,5,9,13,17,21
    2,6,10,14,18,22
    3,7,11,15,19,23
    4,8,12,16,20,24
    

    运行上述脚本后,MYFILEnew1.csv 将如下所示:

    Date    Volume
    1   21
    2   22
    3   23
    4   24
    

    编辑

    使用您的数据(制表符分隔,存储在文件data3.csv中):

    Date    Open    Hihh    mLow    Close   Volume
    17-Feb-16   210 212.97  209.1   212.74  1237731
    

    然后

    import pandas as pd
    
    df = pd.read_csv('data3.csv', sep='\t') 
    
    # select desired columns
    df = df[['Date', 'Volume']]
    
    # write to the file (tab separated)
    df.to_csv('MYFILEnew1.csv', sep='\t', index=False)
    

    给出所需的输出

    Date    Volume
    17-Feb-16   1237731
    

    EDIT2

    由于您的输入 csv 文件中的标题似乎被弄乱了(如 cmets 中所讨论的),您必须重命名第一列。使用您的整个数据集,以下内容现在对我来说可以正常工作:

    import pandas as pd
    
    df = pd.read_csv('lmt.csv', sep=',') 
    
    # get rid of the wrongly formatted column name
    df.rename(columns={df.columns[0]: 'Date' }, inplace=True)
    
    # select desired columns
    df = df[['Date', 'Volume']]
    
    # write to the file (tab separated)
    df.to_csv('MYFILEnew1.csv', sep='\t', index=False)
    

    【讨论】:

    • 我在上面实现了您的脚本,但收到以下错误消息“['Date'] not in index”
    • 您输入的 csv 文件是制表符还是逗号分隔?如果它是制表符分隔的,您需要sep='\t' 作为read_csv 命令中的附加选项。但它应该适用于我提供的示例 csv。 df读入文件后的样子如何?
    • csv 我猜这意味着它的逗号分隔? (对不起,我不擅长这种东西..)
    • 通常是(逗号分隔值 = csv)。您可以在读入文件后打印df 并查看它的外观。我编辑我的问题以说明标签分隔选项。
    • "print df" after "df = pd.read_csv('lmt.csv')" 很好地打印出所有列,但我认为它的 "df = df[['Date', 'Volume'] ]" 失败
    【解决方案2】:

    在这里,我建议使用 csv 模块的 csv.DictReader 对象来读取和写入文件。要读取文件,您可以执行类似的操作

    import csv
    fieldnames=('Date', 'Open', 'High', 'mLow', 'Close', 'Volume')
    with open('myfilename.csv') as f:
        reader = csv.DictReader(f, fieldnames=fieldnames)
    

    除此之外,您只需要从每一行中过滤掉您不想要的键,并同样使用csv.DictWriter 类写入您的导出文件。

    【讨论】:

      【解决方案3】:

      你是如此亲密:

      import csv
      
      f = csv.reader(open('lmt.csv','rb')) # csv is binary
      Date, Open, Hihh, mLow, Close, Volume = zip(*f)
      
      rows = zip(Date, Volume)
      
      ofile = open("MYFILEnew1.csv", "wb")  
      writer = csv.writer(ofile)
      for row in rows:
          writer.writerow(row) # row is already a tuple so no need to make it a list
      
      ofile.close()
      

      【讨论】:

      • 这只是将两列放在新文件的一个列中
      • 这可能与您打开文件的方式有关。
      • 我已将其更改为逗号分隔。
      猜你喜欢
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 2013-11-03
      • 2020-10-20
      • 1970-01-01
      相关资源
      最近更新 更多