在Python中的CSV文件顶部插入一行

时间:2015-04-19 22:54:17

标签: python csv

我想使用python在我的csv文件的顶部追加一行。我需要添加4列。到目前为止,这就是我对代码的要求:

rows= ('A','B','C','D')

fd = open('file.csv','a')
fd.write(rows)
fd.close()

这有两个问题:我得到一个错误说"期望一个字符缓冲对象"我确信这与我的变量"行"有关。

第二个问题是,我认为这只会将其追加到底部,而我则需要将其添加到顶部。

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:2)

您似乎有两个问题:

  1. 您收到错误消息“预期字符缓冲区对象”。

    这是因为你只能将字符串或字符数组写入文件,而元组既不是这些东西(即使它是字符串或字符的元组)。您必须先将元组转换为字符串。一种简单的方法是使用str(('A', 'B', 'C', 'D'))repr(('A', 'B', 'C', 'D'))。如果这对您不起作用,那么最好从每个组件中提取每个组件并形成一个字符串,例如

    a = ''
    for c in ('A', 'B', 'C', 'D'):
        a += c + ' '
    
  2. 您想要附加到文本文件的顶部而不是底部。不幸的是,你不能简单地这样做。有关完整说明,请参阅here。解决这个问题的方法是将整个文件作为字符串读入,将所需的文本插入到文本的开头,然后将其全部重写为文件。

答案 1 :(得分:1)

对于这么简单的事情来说有点矫枉过正,但我​​发现有一个类可以处理像操作一样的电子表格。这是一个围绕独立行的简单方法。

class Table():
    def __init__(self):# instanciates an empty table
        self.rows = []
    def push(self,row): # adds a row to the top of the table
        self.rows = [row]+self.rows
    def que(self,row): #adds a row to the bottom of the table
        self.rows = self.rows+[row]
    def remRowAt(self,i): # Removes a row from the table at a given index
        if(i>=0 and i<len(self.rows)):
            self.rows=self.rows[0:i]+self.rows[i+1:len(self.rows)]
        else:print("index error removing at:"+str(i))
    def addRowAt(self,i,row): #Adds a row at a given index
        if(i>=0 and i<= len(self.rows)):
            self.rows = self.rows[0:i]+[row]+self.rows[i:len(self.rows)]
        else:print("index error adding at:"+str(i))
    def prt(self,delim): # returns the table in the form of a string.
        s =""
        for row in self.rows:
            for entry in row:
                s+= str(entry)+delim
            s=s[0:len(s)-1]+"\n"
        s=s[0:len(s)-1]
        return(s)
    def read(self,s,delim):
        for k in s.split("\n"):
            self.que(k.split(delim))

t = Table()
t.push(['a','b','c','d'])
t.push([1,2,3,4])
t.que(['check','my','work'])
t.remRowAt(1)
t.addRowAt(2,[2,3,4,5])
print(t.prt(","))
copyT = Table()
copyT.read(t.prt(","),',')
print(">")
print(copyT.prt("\t"))

产生

1,2,3,4
check,my,work
2,3,4,5
>
1   2   3   4
check   my  work
2   3   4   5

要解决这个问题,您会注意到prt方法返回的字符串不是列表,允许将其传递给file.write()方法。

答案 2 :(得分:0)

为何出错?

当预计有write时,您正在将元组传递给"character buffer object"。实际上,这意味着它需要一个字符串。

我建议使用python csv.writer类来帮助你。 https://docs.python.org/2/library/csv.html#csv.writer

写入文件顶部。

也许这个答案有帮助:

Python f.write() at beginning of file?

答案 3 :(得分:0)

我不是经验丰富的程序员,但是我在顶部添加行的逻辑是这样的:

  1. 将CSV数据排序并颠倒(我认为Pandas具有排序功能)

      

    您可能需要添加一列数字0- n(我是指序列号),然后才能按照降序对数据进行排序。

  2. 然后追加行>>,您知道它将被追加到底部。

  3. 根据数量增加再次排序。

  4. 现在删除您添加的列。

这样,您底部的数据将到达顶部!

我希望这会有所帮助。

答案 4 :(得分:0)

你可以试试这个:

import csv

row = ['A','B','C','D']

with open(filename, 'r') as readFile:
    rd = csv.reader(readFile)
    lines = list(rd)
    lines.insert(0, row)

with open(filename, 'w',newline='') as writeFile:
    wt = csv.writer(writeFile)
    wt.writerows(lines)

readFile.close()
writeFile.close()