【问题标题】:Return just the columns of a csv仅返回 csv 的列
【发布时间】:2017-01-28 10:39:44
【问题描述】:

我有一个像这样的csv 文件:

Time | Temperature
0.0  | 15.2
3.0  | 16.1
6.0  | 14.8
9.0  | 20.2

现在我想像这样打印/返回它:(["Time", "Temperature"], [[0.0, 3.0, 6.0, 9.0], [15.2, 16.1, 14.8, 20.2]]) 但是来自 python-docs 的代码只是返回这个:

['Time', 'Temperature']
['0.0', '15.2']
['3.0', '16.1']
['6.0', '14.8']
['9.0', '20.2']

如何将其转换为一个列表?

编辑:我写了一个类,对于我的问题,我使用“parse_csv”方法:

import csv

class Table:
    def __init__(self, titles=None, cols=None, filename = None):
        self.titles = titles
        self.cols = cols
        self.filename = filename

    def __str__(self):
        return (str(self.titles) +', '+ str(self.cols))

    def __eq__(self, other):
        try:
            return (self.titles, self.cols) == (other.titles, other.cols)
        except AttributeError:
            return NotImplemented

    def parse_csv(self, filename):
        with open(filename, newline='') as csvfile:
            reader = csv.reader(csvfile)
            for row in reader:
                return row

EDIT2:我用这个检查代码:

titles = ["Time", "Temperature"]
filename1 = "simple_example.csv"
my_table1 = Table(titles, [[0.0, 3.0, 6.0, 9.0], [15.2, 16.1, 14.8, 20.2]])
my_table2 = Table(filename = "simple_example.csv")
assert my_table2 == my_table3   

【问题讨论】:

  • 您可以在列表中附加项目,不是吗
  • 查找python pandas
  • 试试这样的reader = csv.reader(open(filename),delimiter=";") data = list(reader)[1:]
  • 您使用的是什么代码?请edit您的问题并将其与您尝试自己进行的任何修改一起包含在内。
  • 看看zip函数

标签: python python-3.x csv


【解决方案1】:

我假设您想将标题 [column1 和 column2] 作为元组返回。您可以使用 pandas 轻松完成。

import pandas as pd
def parse_csv(file_name):
    df = pd.read_csv(file_name)
    time = df['Time'].as_matrix().tolist() #returns the time column as a list
    temperature = df['Temperature'].as_matrix().tolist() #returns the temperature column as a list
    header = list(df.columns.values) #returns the header values as a list
    return (header, [time, temperature]) #returning a tuple

【讨论】:

    【解决方案2】:

    使用zip()函数的解决方案:

    with open('test.csv', 'r') as fh:
        contents = list(csv.reader(fh, delimiter='|', quotechar='|'))
        result = []
        result.append(contents.pop(0))
        result.append([list(s) for s in list(zip(*contents))])
    
    print(result)
    

    输出:

    [['Time ', ' Temperature'], [['0.0  ', '3.0  ', '6.0  ', '9.0  '], [' 15.2', ' 16.1', ' 14.8', ' 20.2']]]
    

    【讨论】:

    • 我得到一个“'list' object is not callable”错误。
    • @Fleksiu,确保您正在正确访问列表。 stackoverflow.com/questions/18758186/…
    • @Fleksiu, contents 应该是一个列表,而不是 "'_csv.reader' 对象
    【解决方案3】:

    这就是你应该如何定义你的类并初始化它。

    import csv
    
    class Table:
        def __init__(self, titles=None, cols=None, filename = None):
            self.titles = titles
            self.cols = cols
            self.filename = filename
    
        def __str__(self):
            return (str(self.titles) +', '+ str(self.cols))
    
        def __eq__(self, other):
            try:
                return (self.titles, self.cols) == (other.titles, other.cols)
            except AttributeError:
                return NotImplemented
    
        def parse_csv(self, filename=None):
            if not filename:
                filename=self.filename
            with open(filename, newline='') as csvfile:
                reader = csv.reader(csvfile, delimiter='|')
                line = [[a.strip() for a in line] for line in reader]
                self.titles= line[0]
                self.cols = [list(a) for a in zip(*line[1:])]
                self.cols = [[float(b) for b in c] for c in self.cols]
    
    titles = ["Time", "Temperature"]
    filename1 = "simple_example.csv"
    my_table1 = Table(titles, cols=[[0.0, 3.0, 6.0, 9.0], [15.2, 16.1, 14.8, 20.2]])
    my_table2 = Table(filename="simple_example.csv")
    my_table2.parse_csv()
    print my_table1 == my_table2
    

    输出:

    True
    

    【讨论】:

    • 当我将输出与输入的列表手册进行比较时,它不起作用:(
    • @Fleksiu 等待 1 秒
    • @Fleksiu 现在检查。以前,列的末端有空格。
    • @Fleksiu 试试这个:Table(titles, [['0.0', '3.0', '6.0', '9.0'], ['15.2', '16.1', '14.8', '20.2']]
    • 当我将它与“assert my_table2 == my_table3”进行比较时仍然不起作用,但我不知道为什么。
    【解决方案4】:
    a=open('filepath','r')
    final,timel,templ,count=[],[],[],0
    
    for l in a:
        c=l.split(',')
        if count >=1: 
            timel.append(float(c[0]))
            templ.append(float(c[1]))
        if count==0:        #this is just to append the header in the final result
            c[1]=c[1][:-1]  #to remove the '\n'
            final.append(c)
            count+=1  
    
    final.append([timel,templ])
    final=tuple(final)
    
    print(final)
    

    【讨论】:

    • 这对我有用,但我得到了标题(['Time','Temperatures\n'],我怎样才能“删除”\n?
    • 知道了,现在'\n' 不会出现了
    • 好的,当我完全使用它时,我每次都会得到“全局名称“open”未定义”。
    • 是否可以显示完整代码?您要获取的元组的用例是什么?
    【解决方案5】:

    我想这就是你想要实现的目标:

    import csv
    
    def parse_csv(filename):
        with open(filename) as f:
            reader = csv.reader(f)
            header = next(reader)
            cols = list(zip(*reader))
        return [header, cols]
    

    next 返回读取器迭代器的第一个元素(标题行),然后zip 转置列向量中的剩余行。

    【讨论】:

    • 当我这样离开它时,cols 就像 。使用 list(zip()) 我得到“列表对象不可调用”
    • @Fleksiu 抱歉,我的解决方案符合 Python2。现在它也适用于 v3 解释器。
    【解决方案6】:
    import numpy as np
    y = np.array(x)
    z = [y[0],y[1:,0],y[1:,1]]
    res = [i.tolist() for i in z]
    print res
    

    【讨论】:

    • 请使用edit链接来解释这段代码是如何工作的,不要只给出代码,因为解释更有可能帮助未来的读者。另见How to Answersource
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    相关资源
    最近更新 更多