【问题标题】:How to sort this CSV file using Python (3)如何使用 Python 对这个 CSV 文件进行排序(3)
【发布时间】:2017-06-05 10:34:45
【问题描述】:

我查看了一些教程,但仍然无法想出任何方法来对这个文件进行排序,因为它的排序真的很奇怪!

文件如下:(其中 x 是数字,y 是日期,z 是时间,b 是数字)

x x x x x
y y y y y
z z z z z
b b b b b

每行实际上有 50 个条目,但这是文件的一个极其简化的版本。

我正在努力做的是对每个条目进行排序,使其成为 [x,y,z,b]

到目前为止,我想出的只是将每一行分成一个列表,但这显然不是我需要做的,因此我被卡住了。

import csv

with open('sample.txt') as csvfile:
    readCSV = csv.reader(csvfile, delimiter=' ')
    for row in readCSV:
        print(row)

【问题讨论】:

  • 我想我对你使用“排序”这个词感到困惑。听起来您实际上想要做的是旋转它,使行变成列,反之亦然,对吗?
  • @DanielRoseman 是的!确切地。抱歉让您感到困惑,您将如何转换该文件?

标签: python sorting csv


【解决方案1】:

Numpy 的转置就是你要找的,即

from csv import reader
from numpy import transpose
file = open("file.dat")
results = reader(file, delimiter=' ')

print(transpose(list(results)))

【讨论】:

  • 这个结果和上面的代码完全一样,我要做的就是把它分开。
  • 分隔每一列?为初始文件的第 i+1 列执行 res = transpose(list(results)) 并调用 res[i]
【解决方案2】:

排序文件:

x1  x2  x3  x4  x5
y   y   y   y   y
z   z   z   z   z
b   b   b   b   b

计划:

import csv

with open("C:\\Users\\sortfile.csv", 'r') as fopen:
    rows = csv.reader(fopen)
    csvf = list(rows)

x = 0
array = []

while True:
    lines = []
    try:
        for i in csvf:
            lines.append(i[x])
        array.append(lines)
        x +=1
    except IndexError:
        break

结果:

[['x1', 'y', 'z', 'b'], ['x2', 'y', 'z', 'b'], ['x3', 'y', 'z', 'b'], ['x4', 'y', 'z', 'b'], ['x5', 'y', 'z', 'b']]

希望我正确理解了您的问题。

【讨论】:

    【解决方案3】:

    这会打开包含原始值的任何 test.txt 文件,逐行遍历并构造一个转置的数组数组。然后它遍历这些并按照您要求的顺序将它们打印到 newText.txt 以及 csv 中。不知道你想要更多:)。

    import csv
    
    newLine = []
    newArr = []
    
    x = 0
    
    with open ('text.txt', 'r') as f:
        end = len(f.readline().replace(' ',''))
        f.seek(0)
        while x <= end:
            for line in f:
            newLine.append(line.split(" ")[x])
            newArr.append(newLine)
        x += 1
    
    # outputs a text file
    with open ('newText.txt', 'wb') as newf:
        for line in newArr:
            newf.write(' '.join(line) + '\n')
    
    # outputs a csv file
    with open('text.csv', 'wb') as csvfile:
        writeCSV = csv.writer(csvfile)
        for line in newArr:
            writeCSV.writerow(''.join(line))
    

    【讨论】:

      【解决方案4】:

      给定:

      $ cat so.csv
      x1,x2,x3,x4,x5
      y1,y2,y3,y4,y5
      z1,z2,z3,z4,z5
      b1,b2,b3,b4,b5
      

      你通常会像这样逐行读取文件:

      import csv
      
      LoL=[]
      with open(fn) as f:
          for row in csv.reader(f):
              LoL.append(row)
      

      或者,更简洁:

      LoT=[row for row in csv.reader(f)]
      
      >>> LoL
      [['x1', 'x2', 'x3', 'x4', 'x5'], ['y1', 'y2', 'y3', 'y4', 'y5'], ['z1', 'z2', 'z3', 'z4', 'z5'], ['b1', 'b2', 'b3', 'b4', 'b5']]
      

      你可以用zip转置:

      with open(fn) as f:
          LoT=[row for row in zip(*csv.reader(f))]
      
      >>> LoT
      [('x1', 'y1', 'z1', 'b1'), ('x2', 'y2', 'z2', 'b2'), ('x3', 'y3', 'z3', 'b3'), ('x4', 'y4', 'z4', 'b4'), ('x5', 'y5', 'z5', 'b5')]
      

      然后,您可以根据需要将转置的元组列表写入新的 csv 或进程。

      【讨论】:

        猜你喜欢
        • 2019-04-06
        • 2016-07-24
        • 1970-01-01
        • 2017-06-23
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 2017-12-28
        • 1970-01-01
        相关资源
        最近更新 更多