2016-04-12 52 views
-1

Python kullanma Bir dosya okumalı ve tüm satırların aynı uzunlukta olup olmadığını belirlemeliyim. Dosyayı "iyi" bir klasöre taşırlarsa ve hepsi aynı uzunlukta değilse, onları "kötü" bir klasöre taşır ve hangi satırın geri kalanıyla aynı olmadığını söyleyen bir kelime belgesi yazarım. Başlamak için herhangi bir yardım veya yol?Dosyayı oku ve tüm satırların aynı uzunlukta olup olmadığını bulun

+0

Lütfen bir kod snippet'i sunabilir misiniz? İpucu: Bu görevi gerçekleştirmek için birkaç 'for' döngüsünü ve do-while döngüsünü alır ve her satırın ve her sayfanın durumunu saklar. Ayrıca, çıktı üretmek için gereken her zaman çağrılan bir şablon olarak oluşturulan Word belgesi için VBS. Burada çok iş var. – Sparky256

cevap

-1

Önce kapalı, dosyayı okumak, burada example.txt ve listedeki tüm satırları koyabilirsiniz, content:

with open(filename) as f: 
    content = f.readlines() 

Sonraki bir satırın sonuna kadar tüm satır karakterlerini Döşeme ve koymak gerekir başka bir listeye result yılında: Artık

for line in content: 
    line = line.strip() 
    result.append(line) 

kötüsün sıra istiyorum çünkü her cümlenin uzunluğu elde etmek o kadar zor değil, ve, listeyi size döngü:

for line in result: 
    lengths.append(len(line)) 

Dolayısıyla, result'un i-th öğesi, [0-thl elemani lengths] uzunluğuna sahiptir. Listede en fazla satır uzunluğu için bir sayaç yapabiliriz, tek satır kadar basit!

for i in range(len(lengths)): 
    if (lengths[i] != most_occuring): 
     bad_lines.append([i, result[i]]) 

sonraki adım kontrol etmektir dosya nereye gitmek gerekir:

most_occuring = max(set(lengths), key=lengths.count) 

Şimdi başka for-loopbad-lines için bu en-oluşu ile birlikte gelmektedir ve katmayan uzunlukları hangi kontrol etmek yapabilirsiniz iyi klasör veya kötü klasörü:

if len(bad_lines == 0): 
    #Good file, move it to the good folder, use the os or shutil module 
    os.rename("path/to/current/file.foo", "path/to/new/desination/for/file.foo") 
else: 
    #Bad file, one or more lines are bad, thus move it to the bad folder 
    os.rename("path/to/current/file.foo", "path/to/new/desination/for/file.foo") 

-mümkün olduğu başka bir dosyaya kötü satırları yazıyor son adım, zaten kötü hatları var çünkü Bir listedeki bad_lines içinde:

with open("bad_lines.txt", "wb") as f: 
    for bad_line in bad_lines: 
     f.write("[%3i] %s\n" % (bad_line[0], bad_line[1])) 

Bu bir doc dosyası değil, ama bu güzel bir başlangıç ​​olduğunu düşünüyorum. Bir doc dosyasına gerçekten yazmak istiyorsanız, docx modülüne bir göz atabilirsiniz.

DÜZENLEME: İşte bir örnek python betiği.

with open("example.txt") as f: 
    content = f.readlines() 

result = [] 
lengths = [] 

#Strip the file of \n 
for line in content: 
    line = line.strip() 
    result.append(line) 
    lengths.append(len(line)) 

most_occuring = max(set(lengths), key=lengths.count) 
bad_lines = [] 

for i in range(len(lengths)): 
    if (lengths[i] != most_occuring): 
     #Append the bad_line to bad_lines 
     bad_lines.append([i, result[i]]) 

#Check if it's a good, or a bad file 
#if len(bad_lines == 0): 
    #Good File 
    #Move file to the good folder... 
#else: 
    #Bad File 

with open("bad_lines.txt", "wb") as f: 
    for bad_line in bad_lines: 
     f.write("[%3i] %s\n" % (bad_line[0], bad_line[1])) 
+0

'line = line.strip()', bir satırın sonundaki yeni satır karakterinden biraz daha fazla kırpır. – Evert

+0

Yine de yeni satırları çıkarmaya gerek yok. Aynı uzunlukta olmalılar. – zondo

+0

Bunun hakkında daha fazla bilgi almak için haklısınız, ama işi bitirir. Bunu gerçekten de kaldırabilirsiniz, ancak listede daha iyi görünüyor. Bunu bırakırsanız, yazma dosyası bölümünde \ n'yi de kaldırmalısınız. Bunun nedeni, bu durumun düşürülmesiydi mi? Bu benim ilk cevabım, bu yüzden neleri geliştireceğimi bilmek istiyorum. Cevabınız zondo hakkında yorum yapamam ama aynı zamanda farklı olan satırları da soruyor, böylece hepsinden geçmelisiniz. Benim cevabımda ayrıca parçaların daha iyi bir zaman verimliliği için bir döngüde bir araya getirilebileceğini unutmayın (çok değil, hala O (n) olacaktır) –

0

Sen all() kullanmalıdır: kısa devre olduğu

with open(filename) as read_file: 
    length = len(read_file.readline()) 
    if all(len(line) == length for line in read_file): 
     # Move to good folder 
    else: 
     # Move to bad folder 

all() yana, olmayan ilk maçında dosya okunurken duracaktır.

+0

Bu yöntemi deniyorum ve bu hatayı almaya devam ediyorum uzunluk = len (file.readline()) AttributeError: 'str' nesnesinin 'readline' özelliği yok –

+0

@JustinStarkman: Üzgünüm, biraz yazım hatası yaşadım. Şimdi tamir edildi. – zondo