2010-07-19 2 views
0

У меня есть этот txt-файл, который является ls -R каталога etc в системе linux. Файл примера:Python: Как разбить файл?

etc: 
ArchiveSEL 
xinetd.d 

etc/cmm: 
CMM_5085.bin 
cmm_sel 
storage.cfg 

etc/crontabs: 
root 

etc/pam.d: 
ftp  
rsh 

etc/rc.d: 
eth.set.sh 
rc.sysinit 

etc/rc.d/init.d: 
cmm 
functions 
userScripts 

etc/security: 
access.conf 
console.apps 
time.conf 

etc/security/console.apps: 
kbdrate 

etc/ssh: 
ssh_host_dsa_key 
sshd_config 

etc/var: 
setUser 
snmpd.conf 

etc/xinetd.d: 
irsh 
wu-ftpd 

Я хотел бы разбить его по подкаталогам на несколько файлов. файлы примера будут выглядеть так: etctxt, etcCmm.txt, etcCrontabs.txt, etcPamd.txt, ...
Может ли кто-нибудь дать мне код на Python, который может это сделать? Обратите внимание, что строки подкаталога заканчиваются на «:», но я просто недостаточно умен, чтобы написать код. некоторые примеры будут оценены. спасибо :)

+1

Если вы ничего не знаете о Python, самое подходящее, что нужно сделать, это прочитать его и понять, что происходит o п. Перейдите к документам Python, чтобы узнать о Python. Высказывание таких вещей, как «просто недостаточно умное», является лишь оправданием. – ghostdog74

+1

Настоящий * плохой * Извините. –

+0

эй ребята, порежьте меня. Я просто добавил, что эта строка будет скромной. я попытался найти более половины дня для примера или решения, прежде чем я решил опубликовать вопрос. Поблагодарили бы за более конструктивную помощь в следующий раз. – kimberly

ответ

2

Может быть что-то вроде этого? re.M генерирует многострочный регулярное выражение, которое может соответствовать несколько строк, а последняя часть просто перебирает спичек и создает файлы ...

import re 

data = '<your input data as above>' # or open('data.txt').read() 
results = map(lambda m: (m[0], m[1].strip().splitlines()), 
    re.findall('^([^\n]+):\n((?:[^\n]+\n)*)\n', data, re.M)) 

for dirname, files in results: 
    f = open(dirname.replace('/', '')+'.txt', 'w') 
    for line in files: 
     f.write(line + '\n') 
    f.close() 
+0

Ой, этот код очень трудно читать! –

+0

Спасибо за помощь !!! :) – kimberly

+0

@Marius Gedminas: почему вы так думаете? Я думаю, что это легко читать :) – tux21b

0

использование regexp подобный '. *:'.
использование file.readline().
использование петель.

0

Если Python не обязательно, вы можете использовать этот один лайнер

awk '/:$/{gsub(/:|\//,"");fn=$0}{print $0 > fn".txt"}' file 
1

Вам нужно будет сделать это линия за линией. если line.endswith(":"), то вы находитесь в новом подкаталоге. С этого момента каждая строка является новой записью в ваш подкаталог, пока другая строка не закончится с :.

С моей точки зрения, вы просто хотите разбить один текстовый файл на несколько, неоднозначно названных текстовых файлов.

Итак, вы увидите, заканчивается ли линия :. то вы открываете новый текстовый файл, например etcCmm.txt, и каждую строку, которую вы читаете из исходного текста, с этого момента записываете в etcCmm.txt. Когда вы столкнетесь с другой строкой, которая заканчивается на :, вы закрываете ранее открытый файл, создаете новый и продолжаете.

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

+0

Это законно, когда имена файлов заканчиваются на ':'. Лучше проверить на '/' –

+0

, но у него есть 'etc' там без'/'. Я думаю, он мог бы просто проверить на двухстрочные перерывы –

0

Вот что я хотел бы сделать:

Прочитайте файл в память (myfile = open(filename).read() должен делать).

Затем разделить файл вдоль разделителей:

import re 
myregex = re.compile(r"^(.*):[ \t]*$", re.MULTILINE) 
arr = myregex.split(myfile)[1:] # dropping everything before the first directory entry 

Затем преобразовать массив в Словаре, удаление нежелательных символов по пути:

mydict = dict([(re.sub(r"\W+","",k), v.strip()) for (k,v) in zip(arr[::2], arr[1::2])]) 

Затем записать файлы:

for name,content in mydict.iteritems(): 
    output = open(name+".txt","w") 
    output.write(content) 
    output.close() 
Смежные вопросы