Python 3:如何读取csv文件并将特定值存储为变量

时间:2015-08-11 04:31:05

标签: python python-3.x csv

我是SO的新手,编程新手,还有python哈哈,

我正在尝试读取CSV文件(包含不同的数据类型)并将特定值(“坐标”)存储为变量。

CSV文件示例(抱歉使用代码格式,文本不想保持安静):

$id,name,last_name,age,phone_number,addrstr,addrnum
1,Constance,Harm,37,555-1234,Ocean_view,1
2,Homer,Simpson,40,555-1235,Evergreen_Terrace,742
3,John,Doe,35,555-1236,Fake_Street,123
4,Moe,Tavern,20,7648-4377,Walnut_Street,126

我想知道是否有一些简单的方法来存储使用行作为索引的特定值,例如:“取第2行并将第2个值存储在变量Name中,将第3个值存储在变量Lastname中”和“行”每个存储都会有所不同。

不确定这是否会有所帮助,因为我的编码级别非常糟糕:

row = #this value will be taken from ANOTHER csv file
people = open('people.csv', 'r')
linepeople = csv.reader(people)
data = list(linepeople)
name = int(data[**row**][1])
lastname = int(data[**row**][2])
age = int(data[**row**][3])
phone = int(data[**row**][4])
addrstr = int(data[**row**][5])
addrnum = int(data[**row**][6])

我没有发现任何非常相似的指导我进入解决方案。 (我一直在阅读关于字典的内容,也许这对我有帮助吗?)

编辑(如果不允许编辑问题,请告诉我):感谢您的解决方案,我开始了解可能性,但让我提供有关我的预期输出的更多信息:< / p>

我正在尝试创建一个“通用”函数,只在给定的行/列中获取一个值,并将该单个值存储到变量中,而不是整行或整列。

示例:需要将John Doe的电话号码(第5列,第4行)存储到变量中,以便在打印该变量时输出为:555-1236

3 个答案:

答案 0 :(得分:2)

您可以逐行迭代。注意你的示例代码,你试图将人的名字变成整数......

for row in linepeople:
    name=row['name']
    age = int(row['age'])

如果你打算做更复杂的事情,我推荐大熊猫。对于初学者,它会尝试将数字列转换为浮点数,您可以使用属性表示法访问它们。

import pandas as pd
import numpy as np
people = pd.read_table('people.csv', sep=',')

people.name  #  all the names
people.loc[0:2] # first two rows

答案 1 :(得分:1)

您可以使用CSV DictReader,它将根据您的CSV列名称逐行自动分配字典名称,如下所示:

import csv

with open("input.csv", "r") as f_input:
    csv_input = csv.DictReader(f_input)

    for row in csv_input:
        id = row['$id']
        name = row['name']
        last_name = row['last_name']
        age = row['age']
        phone_number = row['phone_number']
        addrstr = row['addrstr']
        addrnum = row['addrnum']

        print(id, name, last_name, age, phone_number, addrstr, addrnum)

这会打印出您的CSV条目,如下所示:

1 Constance Harm 37 555-1234 Ocean_view 1
2 Homer Simpson 40 555-1235 Evergreen_Terrace 742
3 John Doe 35 555-1236 Fake_Street 123
4 Moe Tavern 20 7648-4377 Walnut_Street 126

如果您想要一个只列出名称的列表,可以按如下方式构建它们:

with open("input.csv", "r") as f_input:
    csv_input = csv.DictReader(f_input)
    names = []

    for row in csv_input:
        names.append(row['name'])

    print(names)

,并提供:

['Constance', 'Homer', 'John', 'Moe']

答案 2 :(得分:1)

随着问题的改变,需要一种相当不同的方法。一个简单的get row / col类型函数可以工作但效率很低。每次都需要读取该文件。更好的方法是使用一个类。这将加载文件一次,然后您可以根据需要获得尽可能多的条目。这可以按如下方式完成:

import csv

class ContactDetails():
    def __init__(self, filename):
        with open(filename, "r") as f_input:
            csv_input = csv.reader(f_input)
            self.details = list(csv_input)

    def get_col_row(self, col, row):
        return self.details[row-1][col-1]

data = ContactDetails("input.csv")

phone_number = data.get_col_row(5, 4)
name = data.get_col_row(2,4)
last_name = data.get_col_row(3,4)

print "%s %s: %s" % (name, last_name, phone_number)

通过使用该类,文件只读入一次。这将打印以下内容:

John Doe: 555-1236

注意,Python数字索引从0开始,因此你的5,4必须转换为4,3 for Python。