[英]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.