Python:循环使用多个csv文件并制作多个新的csv文件

时间:2015-10-05 08:45:27

标签: python csv

我开始使用Python,我正在查看csv文件。

基本上我的情况是这样的:

我在csv中有坐标X,Y,Z。

X Y Z
1 1 1
2 2 2
3 3 3

我想通过并为所有Z值添加用户定义的偏移值,并使用编辑过的z值创建一个新文件。

这是我的代码到目前为止我认为是对的:

# list of lists we store all data in
allCoords = []
# get offset from user
offset = int(input("Enter an offset value: "))
# read all values into memory
with open('in.csv', 'r') as inFile: # input csv file
    reader = csv.reader(inFile, delimiter=',') 
    for row in reader:
        # do not add the first row to the list
        if row[0] != "X": 
            # create a new coord list
            coord = []
            # get a row and put it into new list
            coord.append(int(row[0]))
            coord.append(int(row[1]))
            coord.append(int(row[2]) + offset)
            # add list to list of lists
            allCoords.append(coord)

# write all values into new csv file
with open(in".out.csv", "w", newline="") as f:
    writer = csv.writer(f)
    firstRow = ['X', 'Y', 'Z']
    allCoords.insert(0, firstRow)
    writer.writerows(allCoords)

但现在变得困难了。我将如何浏览一堆csv文件(在同一位置),并为每个csv生成一个新文件。

我希望有类似的东西:“filename.csv”变成“filename_offset.csv”,使用原始文件名作为新文件名的启动器,在末尾附加“.offset”。

我想我需要使用“操作系统”。功能,但我不知道如何,所以任何解释将与代码一起受到高度赞赏! :)

对不起,如果我没有多大意义,请告诉我是否需要更清楚地解释。 :)

非常感谢! :)

2 个答案:

答案 0 :(得分:2)

shutil.copy2(src, dst)¶
Similar to shutil.copy(), but metadata is copied as well

shutil

The glob module finds all the pathnames matching a specified pattern
according to the rules used by the Unix shell. No tilde expansion is
done, but *, ?, and character ranges expressed with [] will be correctly matched 

glob

import glob
from shutil import copy2
import shutil
files = glob.glob('cvs_DIR/*csv')

for file in files:

    try:
        # need to have full path of cvs_DIR
        oldName = os.path.join(cvs_DIR, file)
        newName = os.path.join(cvs_DIR, file[:4] + '_offset.csv')
        copy2(oldName,newName)

    except shutil.Error as e:
        print('Error: {}'.format(e))

答案 1 :(得分:1)

顺便说一句,你可以写......

for row in reader:
    if row[0] == "X":
        break
for row in reader:
    coord = []
    ...

......而不是......

for row in reader:
    if row[0] != "X": 
        coord = []
        ...

这会在第一行之后停止检查'X' es。 它的工作原理是因为你没有使用真实的列表,而是使用自我消耗iterator,你可以停止并重启。

另请参阅:Detecting if an iterator will be consumed