python-初学 CSV格式列变换

描述
附件是一个CSV文件,请将每行按照列,排序后输出,不改变各元素格式(如周围空格布局等)。本题以python123嵩老师练习题为例。,题目有所变化,不是原题。

因为自己对CSV的格式不太明白,所以趁这个例子整理清楚。CSV是纯文本数据储存的表格文件,以行分割。每行数据以字符分割符分割,常用’,’。

不使用读取函数,则依旧是文本

f = open('data.csv','r')
print(type(f))
for i in f:
    print(i)

结果是:

<class '_io.TextIOWrapper'>
1,2,3,4,5,6,7

8, 3, 2, 7, 1, 4, 6, 5

6, 1, 3, 8, 5, 7, 4, 2

'a','b','c','x','y','z','i','j','k'

'k', 'b', 'j', 'c', 'i', 'y', 'z', 'a', 'x'

'z', 'c', 'b', 'a', 'k', 'i', 'j', 'y', 'x'

'a', 'y', 'b', 'x', 'z', 'c', 'i', 'j', 'k'

5, 2, 4, 7, 1, 6, 8, 3

.read()读取
这个方法时将整个CSV存在一个字符变量中。

f = open('data.csv','r').read()
print(type(f))
print(f)
<class 'str'>
1,2,3,4,5,6,7
8, 3, 2, 7, 1, 4, 6, 5
6, 1, 3, 8, 5, 7, 4, 2
'a','b','c','x','y','z','i','j','k'
'k', 'b', 'j', 'c', 'i', 'y', 'z', 'a', 'x'
'z', 'c', 'b', 'a', 'k', 'i', 'j', 'y', 'x'
'a', 'y', 'b', 'x', 'z', 'c', 'i', 'j', 'k'
5, 2, 4, 7, 1, 6, 8, 3

.readline()方法读取
也是读入字符串,可以取这一行的前几个字符。

f = open('data.csv','r').readline()
print(type(f))
print(f)
<class 'str'>
1,2,3,4,5,6,7

.readlines()方法读取
将所有行分别作为元素,组成列表,者和其它方法不一样。

f = open('data.csv','r').readlines()
print(type(f))
print(f)
<class 'list'>
['1,2,3,4,5,6,7\n', '8, 3, 2, 7, 1, 4, 6, 5\n', '6, 1, 3, 8, 5, 7, 4, 2\n', "'a','b','c','x','y','z','i','j','k'\n", "'k', 'b', 'j', 'c', 'i', 'y', 'z', 'a', 'x'\n", "'z', 'c', 'b', 'a', 'k', 'i', 'j', 'y', 'x'\n", "'a', 'y', 'b', 'x', 'z', 'c', 'i', 'j', 'k'\n", '5, 2, 4, 7, 1, 6, 8, 3']

本题思路:
可以直接读取,然后每一行去取出来,转化成列表然后sorted()排序,接着转化为字符串输出。一开始的代码:

f = open('data.csv','r')
for i in f:
    b = sorted(list(eval(i)),reverse=True)
    print(','.join(b))

结果报错:

TypeError: sequence item 0: expected str instance, int found

后来找到原因,是因为用.join()将list生成char的时候,元素不能有纯数字,需要都是字符串。
不能str(b),因为这样会将list_b中分隔元素的‘,’也变成字符串。
最后用了这个:

f = open('data.csv','r')
for i in f:
    b = sorted(list(eval(i)),reverse=True)
    print(','.join('%s'%c for c in b))

你可能感兴趣的:(python-初学 CSV格式列变换)