2011-04-28 11 views
17

Me gustaría tener una estructura para cada línea que encuentre en un archivo de texto. (Así que sí, básicamente quiero definir mi estructura, luego contar líneas y completar mis estructuras.)Python - "Struct arrays"

En C++, C# está bien. Pero siempre estoy perdido en Python.

Mis estructuras se vería así:

struct[0].name = "foo" 
struct[0].place = "Shop" 

struct[1].name = "bar" 
struct[1].place = "Home" 

Y así sucesivamente.
(Perdón por la pregunta cojo, esperamos que otros novatos (como yo) lo encontrarán útil.)

Por supuesto, se siente libre de editar la pregunta (título) para reflejar la realidad.

+6

Si continúa a pensar en C++ o C#, podrás siempre estaré perdido en Python. Si quiere dejar de perderse en Python, debe dejar de usar la terminología C++ y C#. Es difícil de hacer, pero es la única manera de no perderse. No podemos editar el título para reflejar su comprensión. Tienes que expandir tu comprensión y luego arreglar el título. Es posible que desee leer http://docs.python.org/dev/library/stdtypes.html nuevamente. –

Respuesta

14
+0

@S. Lott, ¿por qué no solo los dictados que no están limitados a las versiones más recientes de Python? – kanaka

+0

@kanaka: '['foo']' es más difícil de escribir que '.foo' y no agrega ningún valor (suponiendo que los nombres sean correctos. Si los nombres son dinámicos, debe usar dicts de forma reproducible, sí). Y 2.6 no es reciente, debe usarlo de todos modos a menos que el entorno de producción lo obligue a no hacerlo. – delnan

+1

@kanaka: es más fácil actualizar que engañar con una estructura de datos inapropiada. –

4

¿Qué tal una lista de dicts?

mydictlist = [{"name":"foo", "place":"Shop"}, 
       {"name":"bar", "place":"Home"}] 

A continuación, puede hacer

>>> mydictlist[0]["name"] 
'foo' 
>>> mydictlist[1]["place"] 
'Home' 

y así sucesivamente ...

Usando su archivo de ejemplo:

mydictlist = [] 
with open("test.txt") as f: 
    for line in f: 
     entries = line.strip().split(" ", 5) # split along spaces max. 5 times 
     mydictlist.append({"name": entries[0], 
          "time1": entries[1], 
          "time2": entries[2], 
          "etc": entries[5]}) 

le da:

[{'etc': 'Vizfoldrajz EA eloadas 1', 'name': 'Hetfo', 'time2': '10:00', 'time1': '8:00'}, 
{'etc': 'Termeszetfoldrajzi szintezis EA eloadas 1', 'name': 'Hetfo', 'time2': '14:00', 'time1': '12:00'}, 
{'etc': 'Scriptnyelvek eloadas 1', 'name': 'Hetfo', 'time2': '16:00', 'time1': '14:00'} 
...] 
+0

+1, escribía lo mismo, eras más rápido. – lecodesportif

+0

¿Y cómo puedo automatizar esto? Me gusta ... Estoy leyendo el archivo, y luego ¿cómo los creo? Me gusta ... ¿Cómo me refiero a ellos? (Si es una pregunta nueva, lo siento. Y gracias por la (muy) rápida respuesta.) – Shiki

+0

¿Cómo se ve el archivo? –

11

Desea crear un class que contenga los campos name y place.

class Baz(): 
    "Stores name and place pairs" 
    def __init__(self, name, place): 
     self.name = name 
     self.place = place 

A continuación, tendrá que utilizar un list de instancias de esa clase.

my_foos = [] 
my_foos.append(Baz("foo", "Shop")) 
my_foos.append(Baz("bar", "Home")) 

Consulte también: classes (from the Python tutorial).

0

Puede usar un dict o hacer una clase pequeña.

0
>>> s = [{'name': 'foo', 'place': 'shop'}, {'name': 'bar', 'place': 'home'}] 
>>> s[0]['name'] 
'foo' 

Además, recomendaría no nombrarlo 'struct' en python ya que es un módulo de python.

2

IIt depende de lo que tenga como datos.

Si todo lo que desea es almacenar nombres y lugares como cuerdas, sugeriría:

Una lista de namedtuples [(name="foo", place="Shop"), (name="bar", place="Home")]

+0

innecesario para esto y no es compatible con Python 2.6 y anteriores. – kanaka

2

Para casi todos los casos, una lista de Python es análogo a una matriz C. Python tiene un módulo array, pero esa es una envoltura delgada alrededor de matrices C reales, así que no usaría eso a menos que necesites exponer algo a/de C.

Además, una estructura puede representarse fácilmente como un objeto .Algo así como:

class Data(object): 
    def __init__(self, name, place): 
     self.name = name 
     self.place = place 

Entonces usted quiere recorrer el archivo, línea por línea, y rellenar:

my_list = [] 
with open("myfile.txt") as f: 
    for line in f.readlines(): 
     # line is each line in the file 
     # let's pretend our file structure is "NAME PLACE" 
     data = line.split() # data[0] = name, data[1] = place 
     my_list.append(Data(data[0], data[1])) 

# my_list now contains objects of class Data, which has members name and place 

Eso debería ser suficiente de un punto de partida para empezar a moverte y ayudará a entender cómo hacer operaciones básicas de archivo/clase/lista.

0
class Struct: 
    def __init__(self, name, place): 
     self.name = name 
     self.place = place 

structs = [] 
structs.append(Struct("foo","bar")) 
structs.append(Struct("other_foo","other_bar")) 
0

No veo por qué tomar tanto dolor

your_struct clase():

def __init__(self, value, string): 
    self.num = value 
    self.string = string 

C = [[ your_struct(0,'priyank') for j in range(len(n)) ] for i in     
    range(len(n)) ] 
    # for 2-D Matrix 

C = [ your_struct(0,'priyank') for j in range(len(n)) ] // for 1-D array