2015-07-15 2 views
1

Я новичок в Python, поэтому, пожалуйста, пройдите, я уверен, что мой вопрос имеет очень простое решение, которое, кажется, уклоняется от меня. Я пытаюсь написать строку в файл в этом формате:String + Variable + String форматирование в Python

"string1" variable "string2" 

Но всегда кажется, что писать «string2» «string1» переменной

Вот мой код:

inF = open("f:\test\Users.txt", 'r') 
outF = open("f:\test\commands.txt", 'w') 

for line in iter(inF): 
    s = "{0} {1} {2}" .format("adduser ",line," password") 
    outF.write(s) 
inF.close() 
outF.close() 

Я также попытался:

for line in iter(inF): 
    outF.write("adduser " + lines + " password") 

Выход всегда:

passwordadduser user.name 
+1

что ты называешь ИТЭР на итератора? Также нет способа получить какой-либо вывод, который вы опубликовали. –

+0

Он вызывает итерацию в файле. И выход имеет смысл, он просто не завершен. – garph0

+0

@ garph0 файл уже итератор, а вызов 'iter' является избыточным, но не вредным. Во всяком случае, я поддержал это и выступил против его закрытия - действительно, вероятно, что выходные строки в основном выглядят как OP; просто потому, что тонкость, вызывающая проблему, была упущена. И разве это не подходит для курса? :) –

ответ

3

Когда вы читаете строку из файла, она всегда будет включать символ новой строки. Затем вы соединяете это напрямую. Таким образом, в самом деле, что вы видите это:

adduser line1\n 
passwordadduser line2\n 
passwordadduser line3\n 

т.д.

Чтобы это исправить, обнажать линию, когда вы читаете это:

for line in iter(inF): 
    line = line.strip('\n') 
    s = "{0} {1} {2}\n" .format("adduser ",line," password") 
+0

Не просто снимайте новую строку с входа; вам также нужно добавить его к выходным строкам :) –

+0

Вы правы, отредактированы. –

+1

Кроме того, в ответе @germn упоминаются менеджеры контекста, что хорошо. – garph0

1

Если вы проверяете, вы увидите что первые две строки, как это:

adduser user1 
passwordadduser user2 

Вы читаете файл строка за строкой: line будет содержать конечный «\ n», поэтому, когда вы пишете его, он переходит к новой строке, и вы не завершаете то, что вы используете, пишите с помощью новой строки, так что вы получаете passwordadduser. Что-то вроде:

outF.write("{0} {1} {2}\n" .format("adduser ",line.strip()," password"))

Если устранить проблему.

+1

Почему downvote? – garph0

1

Пожалуйста, используйте контекстные менеджеры для работы с файлами. Вы также должны обрабатывать новые символы строки \n во время чтения и записи:

in_filename = "f:\\test\\Users.txt" 
out_filename = "f:\\test\\commands.txt" 

with open(in_filename, 'r') as in_fh, open(out_filename, 'w') as out_fh: 
    for in_line in in_fh: 
     out_line = "{} {} {}\n" .format("adduser", in_line.strip('\n'), "password") 
     out_fh.write(out_line) 

users.txt:

us1 
us2 
us3 

Commands.txt:

adduser us1 password 
adduser us2 password 
adduser us3 password