使用Python读写附加CSV文件

0 投票
1 回答
1743 浏览
提问于 2025-04-18 02:08

我正在尝试使用Python的CSV模块来修改一个CSV文件。这个文件记录了一只股票的信息,包含了日期、开盘价、最高价、最低价、收盘价和当天的交易量等数据。我的目标是通过对现有数据进行一些数学运算,来创建多个新的列。例如,我想要计算从开盘价到最高价的百分比变化,以及从昨天的收盘价到今天的收盘价的百分比变化(目前我在考虑大约增加10列)。

有没有简单的方法可以做到这一点?现在,我是先打开原始文件,把我感兴趣的值读到一个列表中。然后,我会把修改后的值写入一个临时文件。接着,我用一个循环把每个电子表格的行写入一个新文件。最后,我把这个新文件的所有内容写回到原始的CSV文件中,因为我想保持文件名不变(ticker.csv)。

希望我能清楚地表达我的问题。如果你需要任何澄清或更多细节,请随时告诉我。

编辑:我在下面附上了一个函数的代码片段。这个函数的目的是创建一个新列,显示从昨天的收盘价到今天的收盘价的百分比变化。

def add_col_pchange(ticker):
    """
    Add column with percent change in closing price.
    """
    original = open('file1', 'rb')
    reader = csv.reader(original)
    reader.next()
    close = list()
    for row in reader:
        # build list of close values; entries from left to right are reverse chronological
        # index 4 corresponds to "Close" column
        close.append(float(row[4])
    original.close()

    new = open(file2, 'wb')
    writer = csv.writer(new)
    writer.writerow(["Percent Change"])
    pchange = list()
    for i in (0, len(close)-1):
        x = (close[i]-close[i+1])/close[i+1]
        pchange.append(x)
    new.close()

    # open original and new csv's as read, write out to some new file.  
    # later, copy that entire file to original csv in order to maintain 
    # original csv's name and include new data

1 个回答

0

希望这对你有帮助

def add_col_pchange(ticker):
    """
    Add column with percent change in closing price.
    """
    # always use with to transparently manage opening/closing files
    with open('ticker.csv', 'rb') as original:
        spam = csv.reader(original)
        headers = spam.next()  # get header row
        # get all of the data at one time, then transpose it using zip
        data = zip(*[row for row in spam])
    # build list of close values; entries from left to right are reverse chronological
    # index 4 corresponds to "Close" column
    close = data[4]  # the 5th column has close values

    # use map to process whole column at one time
    f_pchange = lambda close0, close1: 100 * (float(close0) - float(close1)) / float(close1)
    Ndays = len(close)  # length of table
    pchange = map(f_pchange, close[:-1], close[1:])  # list of percent changes
    pchange = (None,) + tuple(pchange)  # add something for the first or last day
    headers.append("Percent Change")  # add column name to headers
    data.append(pchange)
    data = zip(*data)  # transpose back to rows

    with open('ticker.csv', 'wb') as new:
        spam = csv.writer(new)
        spam.writerow(headers)  # write headers
        for row in data:
            spam.writerow(row)

    # open original and new csv's as read, write out to some new file.  
    # later, copy that entire file to original csv in order to maintain 
    # original csv's name and include new data

你可以看看 numpy;你可以使用 loadtxt() 和向量运算,不过 @lightalchemist 说得对,pandas 是专门为这个设计的。

撰写回答