2016-12-11 88 views
6

her 5. satır yazdırmak nasıl:Ben sadece içeriği şu şekildedir Ben bir metin dosyası (<code>"name_data.txt"</code>) sahip

name: Kelo 
family name: Lam 
location: Asia 
members: Kelo, Kiko, Jil 

name: Miko 
family name: Naiton 
location: Japan 
members: Miko,Kayati 

metin dosyası aynı desen (adı, soyadı, yeri, üyeleri ile devam ediyor)

Ben ilk satırı çıktısını Başlangıçta "adıyla" tek satır baskı olacağını, böylece daha sonra her 5 satır yazdırmak istiyorum. (, Bu yanlış olmasına rağmen) Şimdiye kadar

["Kelo","Miko"] 

, ben aldık: o zaman benim çıkış olmak

istediğim isim listesini istiyorum

name_data= load_local_file('name_data.txt',ignore_header=False,delimiter='\t') 


def __init __(name_reader): 

    names=list() 
    count=0 
    name_line=5 
    line_number=0 

    for name in name_data: 

     if line_number<5: 

      line_number +=1 

     if line_number ==5: 

      names.append(line_number) 

cevap

1

name_data dosyadaki satırların bir liste olduğunu varsayarsak, basit bir wa

names = [] 
for i in range(1, len(name_data), 5): 
    names.append(name_data[i].split(":")[1].strip()) 
2

yapabilirsiniz y aşağıdaki gibi bu olurdu yapmak:

with open('name_data.txt', 'r') as file: 

    index = 0 
    for line in file: 
     if index % 5 == 0: 
      print(line.split()[1]) 
     index += 1 
+0

Merhaba tom_1230, yorumunuz için teşekkürler. Yazdırmaya çalıştım (çıktı) ve çıktı geri dönüş olarak geri döndü: return codecs.ascii_decode (input, self.errors) [0] UnicodeDecodeError: 'ascii' codec'i bayt 0xde'yi sıfırlayamaz 0: ordinal değil aralık (128); bunun ne anlama geldiğini biliyor musun? – Robbie

+0

Kod benim için mükemmel çalışıyor, belki de metin dosyası kodlaması berbat. Yeni bir .txt dosyası oluşturun ve orijinal sorunuzda belirttiğiniz girişi kopyalayın ve çalışıp çalışmadığını görün. –

+0

Ayrıca, cevabımdaki kodu da güncelledim, sadece isimleri yazdırmak istedim, tüm satırı değil. –

4

Bir dizi karşı linenumber modulo 5 karşılaştırarak her beşinci çizgisini belirleyebilir. Eğer ilk satırı ve 6'ncı, 11., ... sen yineleme içerik yanı sıra hat-rakamları elde etmek

(index 0 ile python'un başlar edin) istedikleri için sizin durumda bu 0 olmalıdır enumerate ile dosya üzerinde.

Ardından dizenin name: bölümünü atmak ve sonrasında gelenleri saklamak için str.split()'u kullanabilirsiniz.

Bir çalışma uygulama aşağıdaki gibi görünebilir:

yerine ayrıca bir adım argümanı ile itertools.islice kullanabilirsiniz enumerate ait
# Create an empty list for the names 
names = [] 

# Opening the file with "with" makes sure it is automatically closed even 
# if the program encounters an Exception. 
with open('name_data.txt', 'r') as file: 
    for lineno, line in enumerate(file): 
     # The lineno modulo 5 is zero for the first line and every fifth line thereafter. 
     if lineno % 5 == 0: 
      # Make sure it really starts with "name" 
      if not line.startswith('name'): 
       raise ValueError('line did not start with "name".') 
      # Split the line by the ":" and keep only what is coming after it. 
      # Using `maxsplit=1` makes sure you don't run into trouble if the name 
      # contains ":" as well (may be unnecessary but better safe than sorry!) 
      name = line.split(':', 1)[1] 
      # Remove any remaining whitespaces around the name 
      name = name.strip() 
      # Save the name in the list of names 
      names.append(name) 

# print out the list of names 
print(names) 

: Eğer kullanmayı düşünebilirsiniz ihtiyaçlarınıza bağlı olarak

from itertools import islice 

with open('name_data.txt', 'r') as file: 
    for line in islice(file, None, None, 5): 
     ... # like above except for the "if lineno % 5 == 0:" line 

: re modül tamamen dosyayı ayrıştırmak için ['Lam', 'Naiton']: Eğer soyadını almak sonra [item[1] for item in all_data] kullanırsanız

senin örneğin ['Kelo', 'Miko'] olmak ve benzeri olacaktır. Düzenli bir ifadeyi başarıyla kullanmak için dosya düzeninize gerçekten uyduğundan emin olmalısınız, aksi halde yanlış sonuçlar elde edersiniz.aşağıdaki gibi

+1

'islice' çözümünüz güzel ... – MaxU

2

verilerin yer aldığı bir name_data.txt dosya olması liste anlama

c = open('test.txt', 'r').readlines() 

# for every fifth line extract out name and store in list 
a = [i.replace('name: ', '').replace('\n', '') for i in c[::5]] 

print(a) # ['Kelo', 'Miko'] 
0

ile tek satırda yapabilirsiniz: İşte 1 2 3 4 5 6 7 8 9 10

ilk ve her 5 satır yazdırmak için aşağıdaki adımları :

content = [line.rstrip('\n') for line in open('name_data.txt')] 
names = [] 
limit = 4 
fp = open("name_data.txt") 
names.append(content[0]) 
for i, line in enumerate(fp): 
    if i == limit: 
     names.append(line) 
     limit += 5 
fp.close() 
print(names) 

Ödeme http://shortcode.pro/code/read-txt-file-and-print-first-and-every-5th-line/

0

Normal ifadeleri kullanabilirsiniz - bunun için Python modülü re.

Sonra name_data.txt varlık ile: - ayar küresel olduğunda, normal ifadenin aynı çizgileri eşleşir

import re 

def get_names(): 

    with open('name_data.txt', 'r') as f: 
     print(re.findall(r'^name:\s*(\w+)', f.read(), flags=re.MULTILINE)) 

if __name__ == '__main__': 

    get_names() 

Not satırlı bayrak ayarı: isimleri alınıyor

name: Kelo 
family name: Lam 
location: Asia 
members: Kelo, Kiko, Jil 

name: Miko 
family name: Naiton 
location: Japan 
members: Miko,Kayati 

tek satırlık basit family name: ... ile. Etkileşimli modda here ifadesine bakın.