Загрузите файл в массив и дважды разделите его двумя разделителями

#python #arrays #delimiter

#python #массивы #разделитель

Вопрос:

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

 place1,time1
place2,time2
place3,time3
  

Я бы хотел, чтобы массив places был местами до и times был временем после ‘,’

Я могу успешно загрузить файлы с помощью open(), а затем разделить их на массив с помощью line.strip().split('n')

 data = open("data.txt", "r")
infoArray = []
for line in data:
    infoArray.append(line.strip().split('n'))
data.close()

print infoArray
  

Я бы ожидал, что places[0] будет place1, places[1] будет place2 и т.д… И чтобы time[0] было time1, time[1], чтобы было time2 и так далее.

Ответ №1:

Вы можете использовать csv модуль для чтения данных, разделенных запятыми, а также zip() при распаковке итеративного reader объекта:

 >>> import csv
>>> with open("data.txt") as f:
...     reader = csv.reader(f)
...     p, t = zip(*reader)
... 
>>> p
('place1', 'place2', 'place3')
>>> t
('time1', 'time2', 'time3')
  

Аргумент в пользу использования csv вместо попытки самостоятельного анализа файла заключается в том, что он будет иметь дело с такими вещами, как значения в кавычках (в стандартном формате CSV), вызов str.split(line, ',') которых завершится неудачей.

Независимо от того, используете ли вы просто file объект или csv.reader результат, любой из них является итеративным; когда вы перебираете их, вы получаете отдельные строки файла. Вот пример более наглядного ввода, где вы можете визуализировать [1, 2] как соответствующий первой строке данных, [3, 4] так и второй:

 >>> a, b = zip(*[[1, 2], [3, 4]])
>>> a
(1, 3)
>>> b
(2, 4)
  

Наконец, в этом примере используется with open() , создается диспетчер контекста и гарантируется, что файл будет закрыт, когда вы закончите его использовать.