读取和写入CSV文件

时间:2016-05-10 12:24:31

标签: python csv

我正在努力使用Python 2.7.10。我正在尝试创建一个程序,最终打开一个CSV文件,从文件中读取数字,使用数字执行计算并写回CSV文件。

代码(即计算)没有完成,我只想尝试几个小位,这样我才能开始发现问题。 CSV文件中的数据如下所示:

['110000,75000\n', '115000,72500\n', '105000,85250\n', '100000,70000']

我遇到的一个问题是将CSV字符串正确转换为数字,然后告诉Python我想在计算中使用哪一行,列;类似于Row(0),Column(0) - Row(1)Column(1)。

我尝试了一些不同的东西,但它似乎在转换为数字位时崩溃了。错误消息是TypeError int() argument must be a string or a number, not listIOError File not open for string - 取决于我尝试过的内容。有人能指出我正确的方向吗?

import csv

def main():
    my_file = open('InputData.csv','rU')
    #test = csv.writer(my_file, delimiter=',')

    file_contents = my_file.readlines()
    print file_contents

    for row in file_contents:
        print row

    #convert to numbers
    #val0 = int(file_contents.readlines(0))
    #val1 = int(file_contents.readlines(1))
    #val0 = int(my_file.readlines(0))
    #val1 = int(my_file.readlines(1))

    #perform calculation
    #valDiff = val1 - val0

    #append to third column, may need to be in write file mode, num to strings
    #file_contents.append
    my_file.close()

main()

3 个答案:

答案 0 :(得分:0)

列表file_contents现在包含所有excel数据,因此尝试使用readlines可能不适用于列表类型。我会试试

row0 = file_contents[0].split(",")

哪个应该以列表格式给你第一行。您应该(并且很可能需要)将其放入循环中以覆盖您拥有的任何大小的excel表。然后

val0 = int(row0[0])

应该给你你想要的价值。但是我会再次进行这种迭代以节省一些时间和精力。

答案 1 :(得分:0)

假设您的文件是纯文本格式,并且您不想使用像pandas这样的第三方库,那么这将是执行此操作的基本方法:

data = []

with open('InputData.csv','r') as my_file:
    for row in my_file:
        columns = row.split(',') #clean and split
        data.append([int(value) for value in columns])

print(data[0][0]) #row=0 col=0
print(data[0][1]) #row=0 col=1

答案 2 :(得分:0)

我认为这会做你想做的事情:

import csv

def main(filename):
    # read entire csv file into memory
    with open(filename, 'rb') as my_file:
        reader = csv.reader(my_file, delimiter=',')
        file_contents = list(reader)

    # rewrite file adding a difference column
    with open(filename, 'wb') as my_file:
        writer = csv.writer(my_file, delimiter=',')
        for row in file_contents:
            val0, val1 = map(int, row)
            difference = val1 - val0
            #print(val0, val1, difference)
            writer.writerow([val0, val1, difference])

if __name__ == '__main__':
    main('InputData.csv')

使用它时要小心,因为它会重写文件。对于测试和调试,您可能希望将结果写入具有不同名称的第二个文件。