繁体   English   中英

使用 Python 从 csv 文件中的特定行号和列号获取值

[英]Getting a value from a specific row and column number in a csv file with Python

在下面的脚本中,我尝试获取存储在 csv 文件的第二行的第一列和第二列中的值。

例如下面的 csv 数据:

Appel, 21,high,yes

Pear, 23, high, no

Ananas, 14, low, no

使用下面的代码,我想在结果中获取信息“Pear”和“23”存储在第二行的第 1 列和第 2 列中。

import csv

with open ("data.csv", "r") as source:
    reader = csv.reader(source)
    data = []
    for row in reader:
        data.append(row)
        result1 = data[2] [1]
        result2 = data[2] [2]
        print (result1, result2)

为了能够做到这一点,我首先将数据初始化为一个空列表。 然后,我通过循环设置第一次迭代。 我的 append 行,这是一个列表。 但是当我执行

result1 = data[2][1]
result2 = data[2][2]

我收到错误消息Index Error: list index out of range 。这可能是由于数据当前是长度为 1 的列表。但我不知道如何更改上面的代码。 你能帮我或给我一些建议来解决这个问题吗

de-dent 最后三行,使它们不在 for 循环中。

import csv

with open ("data.csv", "r") as source:
    reader = csv.reader(source)
    data = []
    for row in reader:
        data.append(row)
    result1 = data[2] [1]
    result2 = data[2] [2]
    print (result1, result2)

或者

with open ("data.csv", "r") as source:
    reader = csv.reader(source)
    data = []
    for row in reader:
        data.append(row)
result1 = data[2] [1]
result2 = data[2] [2]
print (result1, result2)

如果您需要第二行的信息,则不必遍历整个文件。

with open ("data.csv", "r") as source:
    reader = csv.reader(source)
    _ = next(reader)    # throw the first line away
    _ = next(reader)    # throw this blank line away
    result1, result2, *_ = next(reader)
print (result1, result2)

我将假设您的 csv 文件具有如下屏幕截图的格式。 这里有 2 种解决方案,一种使用您当前的逻辑,另一种使用 pandas。

在此处输入图像描述

  1. 逐行读取文件:

'''

with open('help.csv', 'r') as source:
    for row_number, row in enumerate(source.readlines()):
        if row_number == 0:
            continue
        else:
            data = row.split(',')
            result1 = data[0]
            result2 = data[1]
            print(result1, result2)

'''

这是数据变量的样子:

['Apple', '21', 'high', 'yes\n']
['Pear', '23', 'high', 'no\n']
['bananas', '14', 'low', 'no\n']
  • 前者仅使用标准 Python 并假设您的电子表格具有列标题。 如果您没有标题,则可以避免使用 if 语句。
  • 如果它是一个新概念,那么 enumerate 会跟踪您在 for 循环中运行的是哪一个(因为我们正在读取行,所以它充当电子表格中的哪一行)。
  • 由于您使用的是 .csv 文件,因此 using.split(',') 将用逗号(列)分隔每一行。
  • 注意是/否列中的换行符——你可以调用 data[3].strip()
  • 如果您的原始数据没有更改,则此方法效果很好 - 这意味着如果您不更改列格式,但随着数据量的增加它变得相当慢。

2.) 使用 Pandas

  • Pandas 是用于表格(行/列)数据(如 excel)的出色工具。
  • 它比遍历行要快得多

如果您知道您想要梨(或第 1 列中的其他水果)
读入文件,state 你想要数据的水果
“切片”数据以获取水果出现在 column1 中的所有情况
获取我们想要的列中的值

'''

import pandas as pd

df = pd.read_csv("data.csv", headers=True) # make false if no headers
fruit = 'Pear'
data = df[df['Column1']==fruit]          # gets all rows with this fruit
result2 = data['Column2'].values[0]      # gets value in relevant column
print(fruit, result2)      

'''

  • 上面假设我们只有一种水果梨,所以调用 values[0]
  • 如果水果有多个案例,则可以调用 0 > n

我们知道行索引并希望查看数据的情况

'''

import pandas as pd
df = pd.read_csv("data.csv", headers=True) # make false if no headers
row_number = 1
row = df.iloc[row_number,:]
print(row['Column1'], row['Column2']

''''

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM