您的位置:首页 > 编程语言 > Python开发

Python对csv文件指定单元格的处理

2020-05-05 12:28 1196 查看

CSV文件:Comma-Separated Values,逗号分隔值或者字符分割值,其文件以纯文本的形式存储表格数据。用文本文件和Excel都可以打开CSV文件。

下面是分别用excel和记事本打开的两个csv文件。
规范的t.csv

非规范的test.csv

注意:
如果单元格内容中存在逗号,那么这个单元格内容会用双引号分隔出来。如图中test.csv中第一个单元格。
如果单元格内容中存在双引号,那在记事本打开同样会多加引号,具体怎么加这里csv的处理规则好像有点奇怪,目前我也还没完全搞明白。

一般的csv文件都有规范的表头和对应的每行数据,前两张图片中打开的都是规范的csv文件,后两张图片打开的是非规范的csv文件,而Python的csv库中也只有对csv文件整行的操作,并没有像excel一样可以对任意单元格操作,所以要对非规范的csv文件操作任意单元格是困难的。

本文实现了对非规范的csv文件的操作。
思路:csv–>二维列表–>通过列表定位单元格–>列表重写成csv

代码如下:

import csv

class HandleCsv:
# 定义存放csv内容的list
csv_list = []

def __init__(self, filename):
self.filename = filename
with open(self.filename)as fp:
self.csv_list = list(csv.reader(fp))
print(self.csv_list)

# 在第N行第M列空白单元格处修改内容
def modify(self, n, m, value):
self.csv_list[n - 1][m - 1] = value

# 插入第N行
def insert_row(self, n):
self.csv_list.insert(n - 1, [])

# 在第N行第M列单元格插入
def insert_col(self, n, m, value):
# 如果该单元格左边的单元格为空,那么先对左边的单元格写入空格
if len(self.csv_list[n - 1]) < m:
if len(self.csv_list[n - 1]) == m - 1:
self.csv_list[n - 1].append(value)
else:
for i in range(len(self.csv_list[n - 1]), m - 1):
self.csv_list[n - 1].append('')
self.csv_list[n - 1].append(value)
else:
self.modify(n, m, value)

# 删除第N行
def del_row(self, n):
del self.csv_list[n - 1]

# 获取第n行第m列单元格内容
def get_value(self, n, m):
return self.csv_list[n - 1][m - 1]

def list2csv(self, file_path):
try:
fp = open(file_path, 'w')
for items in self.csv_list:
for i in range(len(items)):
# 若元素中含有逗号,那么需要加双引号
if items[i].find(',') != -1:
fp.write('\"')
fp.write(items[i])
fp.write('\"')
else:
fp.write(items[i])
# 最后一个元素不用加逗号
if i < len(items) - 1:
fp.write(',')
fp.write('\n')
except Exception as e:
print(e)

if __name__ == '__main__':
h_csv = HandleCsv(u'test.csv')
# 在第4行处插入一行
h_csv.insert_row(4)
# 在第4行第4列处插入单元格
h_csv.insert_col(4, 4, '第4行,第4列')
h_csv.list2csv(u'test.csv')

运行程序前的csv:

运行程序后的csv:

Code_For_Nothing 原创文章 4获赞 0访问量 668 关注 私信
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: