Как отделить разные форматы ввода из одного и того же текстового файла с помощью Python - PullRequest
0 голосов
/ 08 февраля 2019

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

5
Вашингтон, А, 10
Нью-Йорк, Б, 20
Сиэтл, C, 30
Бостон, B, 20
Атланта, D, 50
2
Нью-Йорк, 5
Бостон, 10

Где формат N , за которыми следуют N строк данных1 и M , за которыми следуют M строк данных2.Я попытался открыть файл, прочитать его построчно и сохранить его в один список, но я не уверен, как создать два списка для Data1 и Data2, чтобы я мог получить:

Data1 = ["Вашингтон, A, 10", "Нью-Йорк, B, 20", "Сиэтл, C, 30", "Бостон, B, 20", "Атланта, D, 50"]
Data2 = ["New York, 5", "Boston, 10"]

Моя первоначальная идея состояла в том, чтобы перебирать список, пока я не нашел целое число i , удалить целое числоиз списка и продолжайте для следующих i итераций все время, сохраняя последующие значения в отдельном списке, пока я не найду следующее целое число и затем повторю.Однако это разрушило бы мой первоначальный список.Есть ли лучший способ разделить два формата данных в разных списках?

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Следующий код создаст список results, равный [Data1, Data2].

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

2
Нью-Йорк, 5
Бостон, 10
Сиэтл, 30

код:

# get the data from the text file
with open('filename.txt', 'r') as file:
    lines = file.read().splitlines()

results = []
index = 0

while index < len(lines):
    # Find the start and end values.
    start = index + 1
    end = start + int(lines[index])

    # Everything from the start up to and excluding the end index gets added
    results.append(lines[start:end])

    # Update the index
    index = end
0 голосов
/ 08 февраля 2019

Вы можете использовать itertools.islice и понимание списка:

from itertools import islice

string = """
5
Washington,A,10
New York,B,20
Seattle,C,30
Boston,B,20
Atlanta,D,50
2
New York,5
Boston,10
"""

result = [[x for x in islice(parts, idx + 1, idx + 1 + int(line))]
          for parts in [string.split("\n")]
          for idx, line in enumerate(parts)
          if line.isdigit()]

print(result)

Это дает

[['Washington,A,10', 'New York,B,20', 'Seattle,C,30', 'Boston,B,20', 'Atlanta,D,50'], ['New York,5', 'Boston,10']]

Для файла:вам нужно изменить его на:

with open("testfile.txt", "r") as f:
    result = [[x for x in islice(parts, idx + 1, idx + 1 + int(line))]
              for parts in [f.read().split("\n")]
              for idx, line in enumerate(parts)
              if line.isdigit()]

print(result)
0 голосов
/ 08 февраля 2019

Вы определенно на правильном пути.Если вы хотите сохранить исходный список, вам не нужно удалять целое число i ;Вы можете просто перейти к следующему пункту.

Код:

originalData = []
formattedData = []

with open("data.txt", "r") as f :
    f = list(f)
    originalData = f
    i = 0
    while i < len(f): # Iterate through every line
        try:
            n = int(f[i]) # See if line can be cast to an integer
            originalData[i] = n # Change string to int in original
            formattedData.append([])
            for j in range(n):
                i += 1
                item = f[i].replace('\n', '')
                originalData[i] = item # Remove newline char in original
                formattedData[-1].append(item)
        except ValueError:
            print("File has incorrect format")
        i += 1

print(originalData)
print(formattedData)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...