【问题标题】:Read last valid rows in csv using python使用python读取csv中的最后一个有效行
【发布时间】:2016-07-09 06:17:35
【问题描述】:

我正在使用 python 从我的 csv 文件中读取数据。但是我只想从 csv 的尾部读取特定的(最后一个有效的)行,还有一个问题是函数应该只在有效时才返回整行。谁能帮我解决这个问题?

下面是我的 csv 文件的样子:

Sr.       Add             A       B       C         D
0   0013A20040D6A141    -308.1  -307.6  -307.7  -154.063    
1   0013A20040DC889A    -308.7  -311.7  -311.7  -154.263    
2   0013A20040DC88C3    -310.1  -310.1  -310.2  -154.863    
3   0013A20040D6A141    -308.2  -306.8  -307.7  -153.863    
4   0013A20040DC889A    -308.7  -311.4  -311.1  -153.263    
5   0013A20040DC88C3      --      --      --       --   
6   0013A20040D6A141    -308.7  -308.3  -305.2  -154.663    

我正在尝试的代码是:

def last_data(address):
    i = sum(1 for line in open("filename.csv", 'r'))
    print i # number of lines in csv
    cache = {} # dict that saved the last data for particular address
    n = 3

    with open("filename.csv",'r') as f:
        q = deque(f, 3)  # 3 lines read at the end
        qp = [''] * n
        if i +1  >=  n:  # for checking whether the number of lines greater than number of add.
            for k in range(n):

                qp[k] = q[k].split(',')

                if address == str(qp[k][1]): # check for particular address in row
                  # if the row has data than put it into json object with address as key and nested key as columns 'A', 'B', etc.      
                    cache.update({address: {'A':struct.pack('>l',int(float(qp[k][3]) * 10)),
                                            'C':struct.pack('>l',int(float(qp[k][4]) * 10))
                                            }})

                    return cache[address]['A'], cache[address]['C']

对于last_data('0013A20040DC88C3'),返回第 5 行无效数据,我想在其中显示第 2 行。任何人都可以告诉我该怎么做吗?

【问题讨论】:

  • 如果数据集不是很大,我可能会使用 pandas,告诉它你使用什么分隔符(tab?),将缺失指定为“---”并在最后删除它们
  • @ChristianSauer 否。它是大型 csv 文件。我已将分隔符与,(comma) 一起使用。但是在这里我用tab 展示了。你能给我提供pandas的例子吗?
  • 也许你应该解释一下你的代码...
  • @JulienBernu 代码已编辑。

标签: python csv tail


【解决方案1】:

有了 pandas,它看起来像这样:

注意:python 2.7。代码。在 Python3 上更改 StringIo 的导入。

import pandas as pd
from StringIO import StringIO

input = """Sr.       Add             A       B       C         D
0   0013A20040D6A141    -308.1  -307.6  -307.7  -154.063    
1   0013A20040DC889A    -308.7  -311.7  -311.7  -154.263    
2   0013A20040DC88C3    -310.1  -310.1  -310.2  -154.863    
3   0013A20040D6A141    -308.2  -306.8  -307.7  -153.863    
4   0013A20040DC889A    -308.7  -311.4  -311.1  -153.263    
5   0013A20040DC88C3      --      --      --       --   
6   0013A20040D6A141    -308.7  -308.3  -305.2  -154.663 
"""

buffer = StringIO(input)

df = pandas.read_csv(buffer, delim_whitespace=True, na_values=["--"])

# you can customize the behaviour here, e.g. how many invalid values are ok per row.
# see http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html

df = df.dropna()

【讨论】:

  • 我已经用 Python 2.7 运行了这段代码。它得到以下错误NameError: name 'StringIO' is not defined
  • @abhi1610 忘记导入了,我已经添加了
  • 感谢您的代码。它删除了我上下文中的无效行。但是我怎样才能读取特定查询的最后数据添加?
  • @abhi1610 我不明白这个问题,你想做什么?
  • 根据你的代码。我已经能够在我的代码中使用('--') 丢弃无效行。但是,当我尝试获取每个特定添加字段数据的最后一行时。我不会明白的。它仅显示6th & 4th,我希望将6th, 4th & 2nd 行作为每个地址的最后一行。
猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多