循环使用Python中的列,并将输出写入文件中的每一列

时间:2018-07-05 08:07:51

标签: python python-3.x

我的数据集中有7列。我脚本的一部分是处理各列并对其进行处理。例如,以下内容适用于第二列

for line in f:
    input_list.append(float(line.split()[1]))

我希望它处理所有7列并将每个输出写为'file $ columnno.dat'

问题1 :这是正确的方法吗?

mylist = [1, 2, 3, 4 , 5, 6, 7]
for n in my list:
    for line in f:
        input_list.append(float(line.split()[n]))

问题2 :现在输出只是数字列表。

print(*closed, sep='\n')

但是我希望每一列的输出都为文件,例如file1.dat (1 is the same syntax of the column no.), file2.dat等。是%f命令。我没有解决它。这似乎很标准,很抱歉,如果我用现有的问题覆盖这个问题。

2 个答案:

答案 0 :(得分:0)

您似乎需要list.extend

例如:

for line in f:
    input_list.extend( map(float, line.split()) )
  • 使用map将列表中的每个元素转换为float

答案 1 :(得分:0)

问题1

您的解决方案将无法工作,因为您无法在同一行上重复两次,除非您使用seek(0)(请参阅文档:Methods of File Objects)从第一行重新开始。相反,您可以迭代每一行并创建一个列表列表,每个子列表代表文件中的一行。

csv模块使语法更容易,因此您不需要手动迭代,分割字符串或转换为floatcsv.reader可以有效地处理这些问题:

from io import StringIO
import csv

mystr = StringIO("""34.12 42.13 4.1 65.13 -42.314 54.1 45.32
0.35 65.13 76.13 17.1 -45.1 65.1 78.1""")

# replace mystr with open('file.txt', 'r')
with mystr as fin:
    reader = csv.reader(fin, delimiter=' ', quoting=csv.QUOTE_NONNUMERIC)
    L = list(reader)

print(L)

[[34.12, 42.13, 4.1, 65.13, -42.314, 54.1, 45.32],
 [0.35, 65.13, 76.13, 17.1, -45.1, 65.1, 78.1]]

问题2

您可以通过zip遍历列表列表的每个索引。然后,在循环中,遍历列中的值。输出将是7个文件,每个文件都有来自原始输入文件的一列。这是一个示例:

for idx, column in enumerate(zip(*L), 1):
    with open(r'c:\temp\out_{0}.csv'.format(idx), 'w', newline='') as myfile:
        writer = csv.writer(myfile)
        for val in column:
            writer.writerow([val])