2016-08-18 45 views
0

我很新,所以請移動此主題,如果它在錯誤的地方或別的東西。試圖讀取一個文件,並在同一時間循環

問題:(快速注:這是所有在Python)我試圖去通過這100個左右的文件,每個文件具有相同的列數,並採取輸入的某些列(同每個文件)並將它們寫入一個新文件。但是,這100個文件不一定都具有相同的行數。在下面的代碼中,filec處於循環狀態,並繼續在整個100個文件中進行更改。我試圖通過查看每個txt文件中的行數並循環多次然後獲取我想要的數字來獲取這些特定的列。

filec = open(string,'r').read().split(',') 
    x = len(filec.readlines()) 

我意識到問題是filec已經使用分割功能後,成爲一個列表,最初是一個字符串時,我使用.read()。如何找到線的數量,所以我可以遍歷行數並獲得我想要的每一行中的位置?

謝謝!

+1

你不需要知道行數。你可以直接使用'for line open(string,'r')迭代。readlines():' – Julien

+0

(對不起,我不知道如何編寫代碼作爲註釋)。也許我誤解了你的評論,或者我沒有解釋清楚,我的不好......所以基本上在上面兩行代碼之後,我說「對於範圍(x)a = 20i + 8b = 20i + 9c = 20i + 9「,其中filec [a],filec [b],filec [c]是我想要的每一行中的值。對不起,我無法在這裏編寫代碼,我是新的:( –

+0

@JulienBernu:不需要['readlines()'](https://docs.python.org/3/library/io.html#io .IOBase.readlines):「請注意,已經有可能在不調用'file.readlines()'的情況下使用'for line in file:...'來迭代文件對象。」與['enumerate(opened_file,start = 1 )'](https://docs.python.org/3/library/functions.html#enumerate)處理的行數。 –

回答

0

你可以做這樣的:

filec = open (filename, 'r') 
lines = filec.readlines() 

for line in lines: 
    words = line.split(',') 
    # Your code here 

原諒我,如果有任何錯誤,我在移動這樣做。

+0

非常感謝!如果可以的話,我會加倍努力,但是因爲我是新手,所以我的聲望不到15:P –

+0

您可以放心,但它仍然很重要。它只是不會顯示在票數上。 –

+0

哦,我看到了,在這種情況下,我想我的確得到了讚揚:)。無論如何感謝您的幫助 –

0

正如你只是尋找的行數,那麼這個怎麼樣 -

t = tuple(open(filepath\filename.txt, 'r')) 

print len(t) 
+0

嗨,請原諒我的無知,但是元組是做什麼的?你是說基本上用你的第一行替換我的代碼的第一行,並用len(t)來表示長度嗎? –

+0

我不知道元組是否需要分割(')。如果確實如此,請糾正我!再次感謝。 –

+0

@ArtificialIntelligence:'tuple'幾乎就像一個'list',它只是它的'不可變'(你不能修改'tuple')。你可以遍歷每個項目並使用'split()'。 – Ejaz

0

我試圖保持代碼清晰,它很可能用較少的線路做。獲取文件名列表,發出字典,將文件名映射到您想要的列(作爲列表)。

def read_col_from_files(file_names, column_number): 
    ret = {} 
    for file_name in file_names: 
     with open(file_name) as fp: 
      column_for_file = [] 
      for line in fp: 
       columns = line.split('\t') 
       column_for_file.append(columns[column_number]) 
     ret[file_name] = column_for_file 
    return ret 

我假設你有製表符分隔的列。這樣稱呼它:

data = read_col_from_files(["file_1.txt", "/tmp/file_t.txt"], 5) 

下面是一個使用列表理解

def read_col_from_files(file_names, column_number): 
    ret = {} 
    for file_name in file_names: 
     with open(file_name) as fp: 
      ret[file_name] = [line.split('\t')[column_number] for line in fp] 
    return ret 

代碼的一個明智的縮短而這裏是如何做到這一點的命令行:

cat FILENAMES | awk '{print $3}'