2017-03-17 70 views
2

我有一個包含1300萬行的CSV文件。數據不是引用封裝的,它包含換行符,這會導致一行數據有換行符。數據不會每行有多箇中斷,只有一箇中斷。如果文件的下一行包含一個字符串,請將其附加到當前行的末尾

我會如何採取這樣的數據?

Line of data 
Line of data 
continuation of previous line of data 
Line of data 
Line of data 
continuation of previous line 
Line of data 

,把它變成這樣:

Line of data 
Line of data continuation of previous line of data 
Line of data 
Line of data continuation of previous line 
Line of data 

我已經存放在變量行和處理下一個,尋找第一個字符是什麼,但「L」這個測試並追加它。我也嘗試使用f.tell()f.seek()在文件中移動,但我一直無法使它工作。

+0

重新制定:如果下一個字符串以空格開頭,則爲延續。順便說一句,['csv'模塊](https://docs.python.org/3/library/csv.html)是否已經處理了這個問題? – 9000

+0

我無法使用CSV模塊,因爲它們沒有用每列的引號進行封裝,而列值有時包含一個或多個逗號。我不得不做很多格式來正確地分割它。編輯:是的我已經嘗試解決源數據問題......這是一個沒有結果的努力 – Taylor

+0

[這個答案](http://stackoverflow.com/a/3788876/1248974)適用於你的簡短的示例數據,不確定我們要如何處理1300萬行 – davedwards

回答

3

假設每一個符合它應該與前一行並置空白開始的時候,這應該工作:

with open(data) as infile: 
    previous_line = None 
    for line in infile: 
     if previous_line is None: 
      previous_line = line 
     if line.startswith(' '): 
      line = previous_line.strip() + line 
     previous_line = line 
     print(line.strip()) 
+0

更加優雅(高效)。謝謝! – Taylor

+0

如果你想把它作爲一個函數(而不僅僅是一次處理文件),你可以修改它來產生行,或者只使用9000的答案(我實際上認爲它更優雅)。 – glarue

0

我能夠解決一些問題。

infile = "test.txt" 
def peek_line(f): 
    pos = f.tell() 
    line = f.readline() 
    f.seek(pos) 
    return line 

f = open(infile, 'r') 
while True: 
    line = f.readline() 
    if not line: 
     break 
    peek = peek_line(f) 
    if not peek.startswith('T'): 
     line = (line.strip() + f.readline()) 
    print line, 

我很樂意提供有關此方法的反饋意見。

+1

這很好,但是你可以將你讀的一行存儲在一個變量中,而不是將它的位置存儲在文件中並尋找它。按順序做事真的很簡單。 – 9000

2

下面是你便宜的,合理有效續行木匠。

def cont_lines(source): 
    last_line = '' 
    for line in source: 
     if line.startswith(' '): 
      last_line += line.lstrip() # append a continuation 
     else: 
      if last_line: 
       yield last_line 
      last_line = line 
    if last_line: # The one remaining as the source has ended. 
     yield last_line 

使用這樣的:

with open("tile.csv") as f: 
    for line in cont_lines(f): 
    # do something with line 

它只使用盡可能多的內存在您的文件中最長的一組續行。

+1

這就像我的,但更好! – glarue

相關問題