Чтение и форматирование текстовых файлов в Python - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь прочитать текстовый файл в словаре, используя python. Когда я открываю файл, он выглядит следующим образом:

SS,City,State,Country,Pop,Age,Random    
('321', 'Houston', 'TX', 'US', '84549', '45', 2000)        
('654', 'Miami', 'FL', 'US', '99999', '55', -2001)    
('940', 'Dallas', 'TX', 'US', '3243', '30', 324113)    

Когда я go открываю свой файл в словаре, я получаю добавленные символы, которых я не вижу в текстовом файле. Я связал зачистку и удаление персонажей, но, похоже, ничего не получается. Вот что происходит, когда я печатаю свой словарь:

("('321'", " 'Houston'"," 'TX'"," 'US'"," '84549'"," '45'",' 2000)')    
("('654'"," 'Miami'"," 'FL'"," 'US'"," '99999'"," '55'"," -2001)')    
("('940'"," 'Dallas'"," 'TX'"," 'US'"," '3243'"," '30'"," 324113)')    

Ниже приведен код, который у меня есть.

locations={}
with open ("locations.txt") as lct:
    z=lct.readline()
    for line in lct:
        line=line.strip().split(",")
        ss, city, state, cntry, pop, age, random = line
    if state == "TX":
        locations[ss] = Texas(ss,city,state,cntry,pop,age,random)
    elif state == "FL":
        locations[ss] = Florida(ss,city,state,cntry,pop,age,random)

Я бы хотел, чтобы строки отображались следующим образом:
('321', 'Хьюстон', 'Техас', 'США', '84549', '45', '2000' )

Есть предложения?

Ответы [ 4 ]

0 голосов
/ 18 июня 2020

Поскольку формат текста соответствует синтаксису Python, использовать eval будет несложно.

text = """('321', 'Houston', 'TX', 'US', '84549', '45', 2000)
('654', 'Miami', 'FL', 'US', '99999', '55', -2001)
('940', 'Dallas', 'TX', 'US', '3243', '30', 324113)"""

locations={}
func = {'TX':Texes, 'FL':Florida}
for line in text.split('\n'):
    args = eval(line)
    ss, state = args[0], args[2]
    if state in func:
        locations[ss] = func(*args)
0 голосов
/ 18 июня 2020

файл - это просто набор текста, где пробел и инвертирование, также рассматриваемое с помощью регулярного выражения, может помочь вам

    import re
    text = "('321', 'Houston', 'TX', 'US', '84549', '45', 2000)"
    pattern = r"(\w+)"
    print(re.findall(pattern,text))

>["321', 'Houston', 'TX', 'US', '84549', '45", '2000']

, поэтому ваш код будет выглядеть как

import re                                         #Added line
pattern = r"(\w+)"                                #Added line

locations={}
with open ("locations.txt") as lct:
    z=lct.readline()
    for line in lct:
        l = re.findall(pattern,line)              #changed line
        ss, city, state, cntry, pop, age, random = l
    if state == "TX":
        locations[ss] = Texas(ss,city,state,cntry,pop,age,random)
    elif state == "FL":
        locations[ss] = Florida(ss,city,state,cntry,pop,age,random)
0 голосов
/ 18 июня 2020

Просто замените три строки 1. (2.) 3. 'пустой строкой, и ваша проблема будет решена.

Пожалуйста, используйте приведенный ниже код

locations={}
with open ("locations.txt") as lct:
z=lct.readline()
for line in lct:
    line.replace("(","")
    line.replace(")","")
    line.replace("'","")
    line=line.strip().split(",")
    ss, city, state, cntry, pop, age, random = line
if state == "TX":
    locations[ss] = Texas(ss,city,state,cntry,pop,age,random)
elif state == "FL":
    locations[ss] = Florida(ss,city,state,cntry,pop,age,random)
    line=line.strip().split(",")
    ss, city, state, cntry, pop, age, random = line
if state == "TX":
    locations[ss] = Texas(ss,city,state,cntry,pop,age,random)
elif state == "FL":
    locations[ss] = Florida(ss,city,state,cntry,pop,age,random)
0 голосов
/ 18 июня 2020

Вы можете просто разрезать входящую строку.

locations={}
with open ("locations.txt") as lct:
    z=lct.readline()
    for line in lct:
        line=line.strip()[1:-1].split(",")
        ss, city, state, cntry, pop, age, random = line
    if state == "TX":
        locations[ss] = Texas(ss,city,state,cntry,pop,age,random)
    elif state == "FL":
        locations[ss] = Florida(ss,city,state,cntry,pop,age,random)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...