2017-01-09 6 views
0

Я новичок в Python и немного борюсь с этой проблемой. Я хотел бы написать функцию, которая берет набор имен файлов BMP из файла с именем FileNames.txt и печатает их в произвольном порядке в только что созданном файле с именем config_1.cfg.Как написать каждую строку файла в новый файл в случайном порядке?

Имена файлов в FileNames.txt файла выглядит следующим образом:

E1I11D0.bmp 
E1I13D0.bmp 
E1I15D0.bmp 
E1I17D0.bmp 
E1I19D0.bmp 
E1I1D0.bmp 
E1I21D0.bmp 

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

#Filename: config_1.cfg 
#Subject: 1 

-PRESENT 1 
[Back] "E1I11D0.bmp" 
[Connect] 0 1 

-CALIBRATION 1 
[Connect] 0 2 

-PRESENT 2 
[Back] "E1I1D0.bmp" 
[Connect] 0 3 

-CALIBRATION 2 
[Connect] 0 4 

-PRESENT 3 
[Back] "E1I19D0.bmp" 
[Connect] 0 5 

Все имена файлов BMP в файле .txt должны быть записаны в произвольном порядке. До сих пор я пытался генерировать .cfg файл вроде этого:

import os 
import random 

curdir = os.getcwd() 
os.chdir('/Users/UserName/Folder') 

index = 1 
count = 1 

# Create output .cfg file 

outfile = open('config_1' + '.cfg', 'w') 

outfile.write('# Filename: config_1' + '\n'); 
outfile.write('#Subject: 1' + '\n'); 

#Get the BMP file names from the .txt file 

with open('FileNames.txt', 'r') as fin: 
    fileId = list(fin) 

random.shuffle(fileId) 

for line in fileId: 

    outfile.write('-PRESENT ' + str(index) + '\n') 
    outfile.write('[Back] ' + str(fileId) + '.bmp' + '\r\n') 
    outfile.write('[Connect] 0 ' + str(index + 1) + '\r\n\r\n') 
    index += 1 

# Add SHUTTERCALIBRATION after each instance of BMP file name being printed 

caliblock = 1 

for line in fileId: 
    outfile.write('-CALIBRATION ' + str(index) + '\r\n') 
    outfile.write('[Connect] 0 ' + str(index + 1) + '\r\n\r\n') 
    index += 1 

За исключением, когда я запускаю код, я то, что я получаю в моем .cfg это:

# Filename: config_1 
#Subject: 1 
-PRESENT 1 
[Back] ['E1_I1_3D0.bmp\r\n', 'E1_I1_5D0.bmp\r\n', 'E1_I1_D0.bmp\r\n',  'E1_I1_9D0.bmp\r\n', 'E1_I1_7D0.bmp\r\n', 'E1_I2_1D0.bmp\r\n',  'E1_I1_1D0.bmp\r\n'].bmp 
[Connect] 0 2 

-CALIBRATION 2 
[Connect] 0 3 

-CALIBRATION 2 
[Connect] 0 3 

-CALIBRATION 2 
[Connect] 0 3 

-CALIBRATION 2 
[Connect] 0 3 

-CALIBRATION 2 
[Connect] 0 3 

-CALIBRATION 2 
[Connect] 0 3 

-CALIBRATION 2 
[Connect] 0 3 

-PRESENT 2 
[Back] ['E1_I1_3D0.bmp\r\n', 'E1_I1_5D0.bmp\r\n', 'E1_I1_D0.bmp\r\n',  'E1_I1_9D0.bmp\r\n', 'E1_I1_7D0.bmp\r\n', 'E1_I2_1D0.bmp\r\n',  'E1_I1_1D0.bmp\r\n'].bmp 
[Connect] 0 3 

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

Буду признателен за любую помощь в этом. Спасибо!

+0

Сколько строк в файле ввода? Можете ли вы прочитать весь файл в памяти, не разбивая машину? – motanelu

+0

'outfile.write ('[Назад]' + str (fileId) + '.bmp' + '\ r \ n')' change 'fileId' to' line' – Bg1850

+0

Вы не должны указывать '' \ r \ n ' 'окончания строки. Python автоматически преобразует '' \ n'' в правильную строку, заканчивающуюся для вашей платформы, если вы не пишете в двоичном режиме (вы не являетесь). –

ответ

1

У вас есть опечатка в вашем коде, итерации по массиву, вы должны отображать текущую строку, а не весь массив.

for line in fileId: 

    outfile.write('-PRESENT ' + str(index) + '\n') 
    outfile.write('[Back] ' + str(fileId) + '.bmp' + '\r\n') 
    ________________________________^ "fileId" should be "line" 
    outfile.write('[Connect] 0 ' + str(index + 1) + '\r\n\r\n') 
    index += 1 
+0

Немного пояснительного введения никому не повредит =) – slezica

+0

Выполнено :) Я подумал, что я был очень понятен ... – motanelu

+0

Спасибо, я исправил его сейчас. Единственная проблема заключается в том, что вместо того, чтобы один экземпляр CALIBRATION распечатывался после каждого имени файла, я получаю 7 идентичных (тот же номер, что и имена файлов). – user2711113

2

Я хотел бы переписать код так:

import random 

with open("FileNames.txt", "r") as f: 
    fnames = f.read().split() 
random.shuffle(fnames) 

chunk_format = """ 
-PRESENT %s 
[Back] "%s" 
[Connect] 0 %s 

-CALIBRATION %s 
[Connect] 0 %s 
""" 

outname = "config_1.cfg" 
with open(outname, "w") as f: 
    f.write("#Filename: %s\n" % outname) 
    f.write("Subject: 1\n") 
    for i, fname in enumerate(fnames): 
     nchunk = i + 1 
     nconnect = 2 * i + 1 
     f.write(chunk_format % (nchunk, fname, nconnect, nchunk, nconnect+1)) 
+0

Это может быть больше Pythonic, чтобы использовать 'str.format', а не оператор modulo. –

+0

Большое спасибо, это отлично решает мою проблему. – user2711113

Смежные вопросы