Чтение списка форматированных данных из файла в python - PullRequest
0 голосов
/ 14 января 2020

Я знаю, что это должен быть простой вопрос для всех вас. У меня есть текстовый файл с контрольными примерами, написанными в формате списка ниже,

[["arg1", "arg2", "arg3"], "Fail"]

[["arg1", "arg2", "arg4"], "Pass"]

. , ,

И я хочу прочитать этот файл в таком списке, что я могу напечатать list1[1] => "Fail".

спасибо за вашу помощь.

Ответы [ 7 ]

2 голосов
/ 14 января 2020

Вы можете использовать ast.literal_eval() для безопасного преобразования строки в выражение python

Пример:

import ast

with open('list.txt') as f:
    lines = f.readlines()

data = [ast.literal_eval(line) for line in lines]

for item in data:
    print(item[1])
2 голосов
/ 14 января 2020

Просто используйте eval, его внутреннюю функцию python, и вам не нужны библиотеки.

Пример:

lists = []
line1 = '[["arg1", "arg2", "arg3"], "Fail"]'
line2 = '[["arg1", "arg2", "arg4"], "Pass"]'
# Evaluate Lines
exLine1 = eval(line1)
exLine2 = eval(line2)
# Append Lines to lists
lists.append(exLine1)
lists.append(exLine2)
# Testing Example of your use case
print(str(exLine1[1] == "Fail"))

Просто преобразуйте этот пример в l oop, который вы используете, и это будет быстро и просто

2 голосов
/ 14 января 2020

Допущения

  • У вас есть файл .txt.
  • Формат строки [["arg1", "arg2", "arg3",...etc.], "Fail/Pass"]

Подход состоит в том, чтобы использовать регулярные выражения, чтобы найти весь текст между двойными кавычками и добавить в список. Последний принимается как «Fail / Pass», а остальные являются аргументами.

import re

result = []

with open('text.txt','r') as f:
    for line in f:
        match = re.findall("\"(.*?)\"",line.strip())
        result.append([match[:-1],match[-1]])

print(result)
print(result[0][0])
print(result[0][1])

Пример ввода .txt file

[["arg1", "arg2", "arg3","arg4"], "Fail"]
[["arg1", "arg2", "arg4"], "Pass"]

Output

[[['arg1', 'arg2', 'arg3', 'arg4'], 'Fail'], [['arg1', 'arg2', 'arg4'], 'Pass']]
['arg1', 'arg2', 'arg3', 'arg4']
Fail
1 голос
/ 14 января 2020

вы можете попробовать что-то вроде ниже:

with open("test.txt", "r") as test_file:
content = test_file.readlines()

print(content)
print(type(content))

for data in content:
    print(ast.literal_eval(data)[1])

print("*" * 30)
for i in range(1, len(content)+1):
    print(i)

вывод:

index:  0

[["arg1", "arg2", "arg3"], "Fail"]

index: 1

[["arg1", "arg2", "arg4"], "Pass"]

1
2
1 голос
/ 14 января 2020

Вы можете взломать довольно простой код манипуляции со строками, который здесь представлен всеми. Я сделал это просто так:

text = """
[["arg1", "arg2", "arg3"], "Fail"]
[["arg1", "arg2", "arg4"], "Pass"]
"""

for line in text.strip().splitlines():
    line = line.replace('[', '')
    line = line.replace(']', '')
    print line.split(',')[-1].strip()

Это не красиво, но вы можете сделать это множеством лучших способов, если вы хотите сделать это - производство.

1 голос
/ 14 января 2020

Я бы сделал так.

пример файла myfile.txt:

[["arg1", "arg2", "arg3"], "Fail"]
[["arg1", "arg2", "arg4"], "Pass"]

Основной python файл.

file1 = open('myfile.txt', 'r') 
count = 0

while True: 
    count += 1

    # Get next line from file 
    list = file1.readline()
    if not list: 
        break
    #convert string to list
    res = list.strip('][').split(', ') 
    print(res[1])

После прочтения строки файла line, преобразовать строку списка в список с помощью split.

0 голосов
/ 14 января 2020

А как насчет этого примера кода из ссылка :

# load additional module
import pickle

with open('listfile.data', 'rb') as filehandle:
    # read the data as binary data stream
    placesList = pickle.load(filehandle)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...