繁体   English   中英

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

[英]Python 3: How to read a csv file and store specific values as variables

我是SO新手,还是编程新手,而python haha​​甚至更多,

我正在尝试读取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行存储在变量名中,将第二个值存储在变量名中,将第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])

我没有发现任何非常相似的东西可以引导我找到解决方案。 (我一直在阅读有关字典的信息,也许对我有帮助?)

编辑 (请让我知道是否不允许编辑问题):感谢您的解决方案,我开始了解各种可能性,但让我提供有关预期输出的更多信息:

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

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

您可以逐行进行迭代。 注意示例代码,您正在尝试将人的名字转换为整数...

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

您可以使用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']

随着问题的改变,将需要一种完全不同的方法。 一个简单的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开始索引,因此对于Python,您的5,4必须转换为4,3。

暂无
暂无

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

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