Проблемы с «AttributeError: объект списка» не имеет атрибута «split» в Python - PullRequest
0 голосов
/ 19 июня 2019

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

Вот так выглядит данный файл:

#
0.010000 125 _
0.130000 125 d
0.225000 125 o
0.260000 125 b
0.275000 125 a
0.335000 125 r
0.400000 125 v
0.455000 125 a
0.530000 125 m
0.580000 125 d

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

x = 0.010000  
y = 125  
z = "_" 

Поскольку я работаю с tkinter, мой текущий код выглядит следующим образом:

    def cutFile(fileAudio, fileTime):
        path = fileAudio.get()
        fileAudioName = os.path.split(path)[1]
        pathTime = fileTime.get()
        fileTimeName = os.path.split(pathTime)[1]
        sound_file = AudioSegment.from_mp3(fileAudioName)
        timeFile = open(pathTime, "r")
        line = timeFile.readlines()
        newLine = line.split("\n")
        for i in range(1, len(newLine)):
            x, y, z = newLine.split(" ")
            print(z)

Кажется, проблема уже начинается со строки

    newLine = line.split("\n")

потому что я получаю AttributeError: у объекта list нет ошибки атрибута split.

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

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Использование:

with open(pathTime) as infile:                #Open file for read
    next(infile)   #Skip #                   
    for line in infile:                       #Iterate Each line
        x, y, z = line.strip().split(" ")     #Strip leading and trailing space and split
        print(x, y, z)

Выход:

0.010000 125 _
0.130000 125 d
0.225000 125 o
0.260000 125 b
0.275000 125 a
0.335000 125 r
0.400000 125 v
0.455000 125 a
0.530000 125 m
0.580000 125 d

В вашем коде вам не нужно newLine = line.split("\n"), потому что readlines() уже разделил содержимое файла на \n

Ex:

timeFile = open(filename, "r")
lines = timeFile.readlines()

for line in lines[1:]:
    x, y, z = line.strip().split(" ")
    print(z)
0 голосов
/ 19 июня 2019

Попробуйте это:

lines = timeFile.readlines()
for x, l in enumerate(lines):
    if l.strip() == '#':
        break
else
    raise TypeError("invalid file content, missing '#' line")

for i in range(x + 1, len(lines), 1):
    l = lines[i]
    x, y, z = l.split()
    print(z)

Что здесь происходит? После того как вы откроете файл, прочитайте его, позвонив по номеру timeFile.readlines(). Это возвращает список строк. Итак, сначала мы ищем вашу «стартовую» строку, содержащую только #. Мы удаляем пробелы, так как мы обычно не хотим иметь с ними дело, а «#» и «#» выглядят почти одинаково и их легко пропустить в отредактированном вручную файле. После того, как мы нашли эту строку, мы выполняем итерацию от следующего до конца файла и для каждой строки l мы разделяем ее, вызывая split() и печатая z.

...