2016-01-11 2 views
2

Я пытаюсь напечатать кортеж из 5 списков в файл в Python, однако, я получаю ошибку:Python: Не удается напечатать кортеж из 5 списков в файл

TypeError: Can't convert 'tuple' object to str implicitly 

следующий мой код:

def listjoin(): 
illegallist = zip(carreglist, illegalspeed, illegaltime, illegalname, illegaladdress) 
for item in illegallist: 
    illegaldatafile.write("Registration: "+item) 
    illegaldatafile.write("\n") 
    illegaldatafile.write("Speed "+item) 
    illegaldatafile.write("\n") 
    illegaldatafile.write("Time: "+item) 
    illegaldatafile.write("\n") 
    illegaldatafile.write("Name: "+item) 
    illegaldatafile.write("\n") 
    illegaldatafile.write("Address: "+item) 
    illegaldatafile.write("\n") 
    illegaldatafile.write("\n") 
    illegaldatafile.close() 

Я пытаюсь получить что-то вроде этого:

Registration: BH34JKX 
Speed: 80 
Time: 6:45:21 
Name: John Adams 
Address: SW34 7MN 

Registration: DX34JKS 

и т.д .. (Accidentally размещены слишком рано)

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

illegallist = zip(str(carreglist, illegalspeed, illegaltime, illegalname, illegaladdress)) 

Потому что str() принимает только 3 аргумента. я попытался положить его здесь:

illegallist = str(zip(carreglist, illegalspeed, illegaltime, illegalname, illegaladdress)) 

Но это как раз говорит, что мой файл закрывается.

+2

1. Вы можете только писать строки в файлы. 2. Почему вы пытаетесь написать один и тот же объект ('item') в каждой строке и ожидаете, что каждый раз вы получите другой результат? – TigerhawkT3

+0

Распакуйте список, и если это не строки, их бросить. –

+0

@MalikBrahimi: Вы имеете в виду «распаковать _tuples_». –

ответ

5

Вместо вызова элемента каждой итерации цикла просто item, вы должны распаковать его, так что вы можете легко ссылаться на каждый объект. Строка форматирования также будет полезно:

def listjoin(): 
    illegallist = zip(carreglist, illegalspeed, illegaltime, illegalname, illegaladdress) 
    for reg,speed,timing,name,address in illegallist: 
     illegaldatafile.write("Registration: {}\n".format(reg)) 
     illegaldatafile.write("Speed: {}\n".format(speed)) 
     illegaldatafile.write("Time: {}\n".format(timing)) 
     illegaldatafile.write("Name: {}\n".format(name)) 
     illegaldatafile.write("Address: {}\n\n".format(address)) 
    illegaldatafile.close() 
+0

Спасибо за это, он работает очень хорошо. – Appel

5

Вы добавляете один и тот же кортеж item снова и снова к строке. Вы должны взять отдельные элементы из этого кортежа. Это мой (более компактный) предложение:

colnames = ['Registration', 'Speed', 'Time', 'Name', 'Address'] 
for tup in zip(carreglist, illegalspeed, illegaltime, illegalname, illegaladdress): 
    for colname, value in zip(colnames, tup): 
     illegaldatafile.write('{}: {}\n'.format(colname, value)) 
    illegaldatafile.write('\n') 
+0

Извините, но ответ TigerhawkT3 больше похож на мой, и я не хочу его слишком сильно менять. – Appel

0

Вы можете использовать print заявление с file параметром и, если у вас есть только 5 кортежей можно использовать %:

def listjoin(): 
    illegallist = zip(carreglist, illegalspeed, illegaltime, illegalname, illegaladdress) 
    for item in illegallist: 
     print("Registration: %s" % item[0], file=illegaldatafile) 
     print("Speed: %s" % item[1], file=illegaldatafile) 
     print("Time: %s" % item[2], file=illegaldatafile) 
     print("Name: %s" % item[3], file=illegaldatafile) 
     print("Address: %s" % item[4], file=illegaldatafile) 
     print(file=illegaldatafile) 
    illegaldatafile.close()