2016-08-18 75 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}'