轻松访问数据

时间:2015-12-30 16:49:17

标签: python database string list tuples

我之前已经问过这个问题,但是我的问题太复杂,所以我得到了我无法使用的答案(这是针对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

我可以很容易地把它变成一个元组或列表,但我喜欢字符串更方便(但它真的吗?)。

总而言之,如何根据一些信息轻松找到一些信息?谢谢。

3 个答案:

答案 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家商店拥有最多的客户?"这是过度的 - 但是或者"过去一个月每家商店增加了多少客户?"。