我之前已经问过这个问题,但是我的问题太复杂,所以我得到了我无法使用的答案(这是针对uni项目的,所以尽量不要导入东西)。 所以,我在.txt中有一个列表,如下所示:
num_cliene,store,name,surname,location
11,2,LISA,ANDERSON,Evora
13,2,KAREN,JACKSON,里斯本
4,2,BETTY,WHITE,Seixal
我需要以一种我可以输入客户编号的方式访问这些数据,并且它为我提供了他们的姓氏/位置,到目前为止,我能够创建一个字符串
def listagerador():
clientesfich=open("clientes.txt", "r")
listacli = ""
for line in clientesfich:
listacli+=line
我可以很容易地把它变成一个元组或列表,但我喜欢字符串更方便(但它真的吗?)。
总而言之,如何根据一些信息轻松找到一些信息?谢谢。
答案 0 :(得分:1)
您可以通过以下方式创建dict
:
def listagerador(fname):
d = {}
with open(fname, "r") as clientesfich:
for line in clientesfich:
fields = line.rstrip().split()
d[int(fields[0])] = fields[:1]
return d
my_data = listagerador("clientes.txt")
client_num = 1
print my_data[client_num]
答案 1 :(得分:0)
从文本文件中读取此数据后,这似乎是创建class
的好时机。例如
class Client:
def __init__(self, id_num, store_num, first_name, last_name, location):
self.id_num = id_num
self.store_num = store_num
self.first_name = first_name
self.last_name = last_name
self.location = location
def __repr__(self):
return '{} {}'.format(self.first_name, self.last_name)
您可以使用从每行的文件中读取的内容创建Client
的实例
>>> lisa = Client(11, 2, 'Lisa', 'Anderson', 'Evora')
>>> karen = Client(13, 2, 'Karen', 'Jackson', 'Lisbon')
>>> betty = Client(4, 2, 'Betty', 'White', 'Seixal')
如果您拥有这些Client
个实例的集合,则可以进行过滤,例如检查商店编号
>>> customers = [lisa, karen, betty]
>>> [client for client in customers if client.store_num == 2]
[Lisa Anderson, Karen Jackson, Betty White]
然后,您可以为dict
的实例创建id_num
Client
,例如
>>> ids = dict((client.id_num, client) for client in customers)
>>> ids
{11: Lisa Anderson,
4: Betty White,
13: Karen Jackson}
可让您进行查找,然后查找有关它们的任何其他信息
>>> ids[4]
Betty White
>>> ids[4].location
'Seixal'
答案 2 :(得分:0)
对于简单的东西,编写自己的数据处理例程很好。一旦开始变得更复杂,您将通过委托数据库来保存您的理智。
Python内置了Sqlite3,而且它非常简单易用。首先,我们需要将您的数据填充到数据库中。这只需要完成一次:
import sqlite3
# open (or create) the database file
db = sqlite3.connect('data/client_list')
cursor = db.cursor()
# create table
cursor.execute(
"""
CREATE TABLE clients(
id INTEGER PRIMARY KEY,
num INTEGER,
store_id INTEGER,
name TEXT,
surname TEXT,
location TEXT
)
"""
)
db.commit()
# load data from csv file
import csv
with open('clientes.txt', newline='') as inf:
rd = csv.reader(inf, skipinitialspace=True)
next(rd) # skip header row
data = list(rd)
# convert num and store_id from str to int
for row in data:
row[0] = int(row[0])
row[1] = int(row[1])
# stuff data into the database
cursor.executemany(
"""
INSERT INTO clients(num, store_id, name, surname, location)
VALUES(?, ?, ?, ?, ?)
""",
data
)
db.commit()
# make sure all changes get saved!
db.close()
现在我们可以像
一样查询它import sqlite3
db = sqlite3.connect('data/client_list')
cursor = db.cursor()
def get_client_by_num(num):
cursor.execute(
"""
SELECT num, store_id, name, surname, location
FROM clients
WHERE num=?
""",
(num,) # pass parameters as a tuple
)
return cursor.fetchone()
get_client_by_num(11) # returns (11, 2, 'Lisa', 'Anderson', 'Evora')
现在你的数据在数据库中很容易就会出现问题,例如"哪3家商店拥有最多的客户?"这是过度的 - 但是或者"过去一个月每家商店增加了多少客户?"。