我是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
答案 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。