2010-07-19 5 views
0

J'ai ce fichier txt qui est ls -R du répertoire etc dans un système Linux. Exemple de fichier:Python: Comment partager le fichier?

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 

Je voudrais le découper par sous-répertoires en plusieurs fichiers. les fichiers d'exemple seraient comme ceci: etctxt, etcCmm.txt, etcCrontabs.txt, etcPamd.txt, ...
Quelqu'un peut-il me donner un code python qui peut le faire? Notez que les lignes de sous-répertoire se terminent par ':', mais je ne suis pas assez intelligent pour écrire le code. quelques exemples seraient appréciés. merci :)

+1

Si vous ne savez rien à propos de Python, la chose la plus décente à faire est de lire et de comprendre ce qui se passe. n. Dirigez-vous vers des docs Python pour en savoir plus sur Python. Dire des choses comme "pas assez intelligent" n'est qu'une excuse. – ghostdog74

+1

Une vraiment * mauvaise * excuse. –

+0

hey les gars, me couper un peu de mou. Je viens d'ajouter cette ligne pour être modeste. J'ai essayé de chercher plus d'une demi-journée pour un exemple ou une solution avant que je décide de poster la question. J'apprécierais une aide plus constructive la prochaine fois. – kimberly

Répondre

2

Peut-être quelque chose comme ça? re.M génère une expression régulière multiligne qui peut correspondre à plusieurs lignes, et la dernière partie seulement itère sur les matches et crée les fichiers ...

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

Aïe, ce code est très difficile à lire! –

+0

Merci pour l'aide !!! :) – kimberly

+0

@Marius Gedminas: pourquoi le pensez-vous? Je pense que c'est facile à lire :) – tux21b

0

utilisez regexp comme '. *:'.
utilisez file.readline().
utiliser des boucles.

0

Si Python n'est pas un must, vous pouvez utiliser cette ligne

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

Vous aurez besoin de le faire ligne par ligne. si un line.endswith(":") alors vous êtes dans un nouveau sous-répertoire. À partir de là, chaque ligne est une nouvelle entrée dans votre sous-répertoire, jusqu'à ce qu'une autre ligne se termine par :. D'après ce que je comprends, vous voulez juste scinder un fichier texte en plusieurs fichiers texte nommés de manière ambiguë.

Donc, vous verriez si une ligne se termine par :. puis vous ouvrez un nouveau fichier texte, comme etcCmm.txt, et chaque ligne que vous lisez du texte source, à partir de ce point, vous écrivez dans etcCmm.txt. Lorsque vous rencontrez une autre ligne qui se termine par :, vous fermez le fichier précédemment ouvert, en créer un nouveau et continuer.

Je laisse quelques petites choses pour vous de vous faire, comme déterminer ce qu'il faut appeler le fichier texte, la lecture d'une ligne par ligne fichier, etc.

+0

Il est légal que les noms de fichiers se terminent par ':'. Mieux vaut vérifier le '/' –

+0

mais il a 'etc' dedans là sans'/'. Je suppose qu'il pourrait juste vérifier les pauses de deux lignes –

0

Voici ce que je ferais:

Lire le fichier dans la mémoire (myfile = open(filename).read() devrait faire).

ensuite Fractionner le fichier le long des délimiteurs:

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

convertir ensuite le tableau à un dict, en supprimant les caractères indésirables le long du chemin:

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

écrire ensuite les fichiers:

for name,content in mydict.iteritems(): 
    output = open(name+".txt","w") 
    output.write(content) 
    output.close() 
Questions connexes