2017-04-13 66 views
0

我想讀取文本文件並將'~~~~~~~~~~~~~'之間的文本複製到數組中。然而,我在Python是新的,這是因爲據我得到:使用字符串和數組時遇到問題

with open("textfile.txt", "r",encoding='utf8') as f: 
    searchlines = f.readlines() 

a=[0] 
b=0 
for i,line in enumerate(searchlines): 
    if '~~~~~~~~~~~~~' in line: 
     b=b+1 
    if '~~~~~~~~~~~~~' not in line: 
     if 's1mb4d' in line: 
      break 
     a.insert(b,line) 

這是我設想: 首先,我閱讀文本文件的所有行,然後 我宣佈「一」作爲應該添加文本的數組, 然後我聲明'b',因爲我需要它作爲索引。 '~~~~~~~~~~~~~'之間的行數不是偶數,這就是爲什麼我使用'b'所以我可以將文本行放入一個數組索引,直到一個新的'~~ ~~~~~~~~~~''被找到了。

我檢查'~~~~~~~~~~~~~',如果發現我增加'B',所以我可以開始添加文本行到一個新的數組索引。 文本文件以's1mb4d'結尾,所以一旦找到它,程序結束。 如果'~~~~~~~~~~~~~'沒有在行中找到,我添加文本到數組。

但事情並不順利。這些「~~~~~~~~~~~~~~」之間的全部文本行只有1行被複制到每個數組索引。

這裏是文本文件的例子:asdasdjfjfjf

~~~~~~~~~~~~~

Text123asdasd ~~~~~~~~~ ~~~~

123ABC 321bca gjjgfkk

~~~~~~~~~~~~~

+0

首先,什麼是「s1mb4d」的意義是什麼?其次,從一個空數組「a」開始,因爲0不是你正在查找的行。 – DyZ

+0

爲什麼你不要刪除所有'~~~~~~~~~~'? –

+0

文件讀取和行枚舉可能不必要的開銷。同意@dylan_fan,使用're'進行文本搜索和驗證。 –

回答

0

在Python中解決的問題有很大一部分是經常發現從一個根本的標準庫正確的函數工作。在這裏你應該嘗試使用split來代替,它應該會更容易。

如果我理解正確的話你的目標,你可以做這樣的:

joined_lines = ''.join(searchlines) 
result = joined_lines.split('~~~~~~~~~~') 

第一行加入你的線條列表變爲sinle字符串,然後第二個切口是大串每一個時代它遇到'~~'序列。

+0

哇,簡單而高效!多麼好的社區,謝謝 – Sunsh1ne

1

你可以使用正則表達式的表達,試用一下這個:

import re 

input_text = ['Text123asdasd asdasdjfjfjf','~~~~~~~~~~~~~','123abc 321bca gjjgfkk','~~~~~~~~~~~~~'] 

a = [] 
for line in input_text: 
    my_text = re.findall(r'[^\~]+', line) 
    if len(my_text) != 0: 
     a.append(my_text) 

它所做的是它讀取一行行查找所有字符,但「〜」,如果行只包含「〜」它會忽略,每行包含文本的行都會附加到列表中。

而只是因爲我們可以,oneliner(不包括進口和源OFC):

import re 

lines = ['Text123asdasd asdasdjfjfjf','~~~~~~~~~~~~~','123abc 321bca gjjgfkk','~~~~~~~~~~~~~'] 
a = [re.findall(r'[^\~]+', line) for line in lines if len(re.findall(r'[^\~]+', line)) != 0] 
0

我試圖清理它,據我所知,試試這個,讓我知道它是否有效。我們可以一起努力!:)

with open("textfile.txt", "r",encoding='utf8') as f: 
    searchlines = f.readlines() 

a = [] 
currentline = '' 

for i,line in enumerate(searchlines): 
    currentline += line 
    if '~~~~~~~~~~~~~' in line: 
     a.append(currentline) 
    elif 's1mb4d' in line: 
     break 

一些注意事項:

  • 您可以使用ELIF爲您的假日功能
  • 追加將自動下一次迭代添加到陣列
  • currentline將繼續增加結束每行只要沒有's1mb4d'或~~~我認爲是你想要的文字
+0

你的回覆最有用! 也許我沒有說清楚,但其他人的程序設法在每個數組索引中追加1行文本,而不是'~~~~~~~~~~~~~的。 不幸的是,你的程序會讓每個下一個數組索引都將文本從最後一個索引添加到它自己,所以如果我打印一個[1],它也會打印一個[0]。我希望每個索引都有一對'~~~~~~~~~~~~~'的文字 – Sunsh1ne

0
s = [''] 
with open('path\\to\\sample.txt') as f: 
    for l in f: 
     a = l.strip().split("\n") 
     s += a 

a = [] 
for line in s: 
    my_text = re.findall(r'[^\~]+', line) 
    if len(my_text) != 0: 
     a.append(my_text) 
print a 
>>> [['Text123asdasd asdasdjfjfjf'], ['123abc 321bca gjjgfkk']] 
0

如果您願意強制/接受分隔符應該是13個字符的約束(實際上是'\ n%s \ n'%('〜'* 13))。 。 那麼你可以只用

#!/usr/bin/python 
## (Should be #!/usr/bin/env python; but StackOverflow's syntax highlighter?) 
separator = '\n%s\n' % ('~' * 13) 
with open('somefile.txt') as f: 
    results = f.read().split(separator) 

# Use your results, a list of the strings separated by these separators. 

注意,「〜」 * 13是一種方法,在Python中,通過重複一些規模較小的字符串十三次構造一個字符串完成這一相對正常大小的文件。 'xx%sxx'%'YY'是將一個字符串「插入」另一個字符串的一種方法。當然,你可能只是十三〜字符粘貼到你的源代碼...但我會考慮構建字符串,如圖所示明確表示長度字符串的規範的一部分---這是你的文件格式的一部分要求......並且任何其他數量的〜字符都不夠用。

如果你真的想要的任何數量的〜任意字符的行充當隔膜比你要使用的.split()方法從正則表達式模塊,而不是.split()方法由內置的字符串對象提供。

注意,此代碼片段將返回所有的文字你的分割線之間,包括它們包括任何換行符。還有其他代碼片段可以過濾掉這些代碼片段。例如,給定我們以前的結果:

# ... refine results by filtering out newlines (replacing them with spaces) 
results = [' '.join(each.split('\n')) for each in results] 

(你也可以使用.replace()字符串方法;但我更喜歡加入/拆分組合)。在這種情況下,我們使用一個列表理解(Python中的一個特徵)來遍歷在我們的結果,我們正在隨意命名每個)每一個項目,就可以執行我們的改造,結果列表正在boun回到名字結果;如果您要學習Python,我強烈建議學習並理解列表理解。與許多其他編程和腳本語言的語法相比,它們通常使用並且可能有點異國情調)。

這應該在MS Windows工作,以及UNIX(和類Unix),因爲Python如何處理系統「通用換行。」要在Python 3下使用這些示例,您可能需要對編碼和字符串類型稍加處理。 (我不需要在MacOS X下使用Homebrew安裝我的Python3.6,但只是預先警告)。

相關問題