如何遍历所有CSV文件,打开每个CSV文件并对其执行一些操作?

时间:2018-11-01 14:18:52

标签: python python-3.x

我正在尝试遍历文件夹中的所有CSV文件,打开每个CSV文件,执行一些查找/替换操作,然后保存并关闭每个CSV文件。我认为这是我的代码,应该很接近,但是显然有些问题了,因为它无法正常工作。

import glob
path = "C:\\Users\\ryans\\OneDrive\\Desktop\\downloads\\Products\\*.csv"
for fname in glob.glob(path):
    print(str(fname))
    with open(str(fname)) as f:
        newText = f.read().replace('|', ',').replace(' ', '')

with open(str(fname), "w") as f:
    f.write(newText)

这是怎么了?

3 个答案:

答案 0 :(得分:3)

您应该完成操作并关闭for循环中的文件。

请注意,使用原始字符串作为路径而不是使用每个反斜杠转义会更优雅

import sys
from PyQt5 import QtCore, QtWidgets

class TreeList:
    def __init__(self):
        self._items = list()

class TreeModel(QtCore.QAbstractItemModel):
    def __init__(self, root, parent=None):
        super().__init__(parent)
        self.root = root

    def index(self, row: int, column: int, parent: QtCore.QModelIndex = ...) -> QtCore.QModelIndex:
        if not self.hasIndex(row, column, parent):
            return QtCore.QModelIndex()

        if not parent.isValid():
            pointer = self.root  # type: TreeList
            child = pointer._items[row]
        else:
            child = None

        return self.createIndex(row, column, child)

    def addItem(self, layer):
        row = len(self.root._items)
        self.beginInsertRows(QtCore.QModelIndex(), row, row)
        self.root._items.append(layer)
        self.endInsertRows()

    def parent(self, child: QtCore.QModelIndex) -> QtCore.QModelIndex:
        return QtCore.QModelIndex()

    def rowCount(self, parent: QtCore.QModelIndex = ...) -> int:
        if parent.isValid():
            return 0
        else:
            return len(self.root._items)

    def columnCount(self, parent: QtCore.QModelIndex = ...) -> int:
        return 1

    def hasChildren(self, parent: QtCore.QModelIndex = ...) -> bool:
        return False if parent.isValid() else True

    def data(self, index: QtCore.QModelIndex, role: int = ...):
        # return self.root._items[index.row()]
        if role == QtCore.Qt.SizeHintRole:
            print(index.isValid(), index.row(), index.column())
            return QtCore.QSize(100, 20)
        else:
            return self.root._items[index.row()]

    def flags(self, index: QtCore.QModelIndex):
        return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable


class StackTreeView(QtWidgets.QTreeView):
    def __init__(self, data=None, parent=None):
        super().__init__(parent)
        self.setModel(TreeModel(data))

    def addItem(self, layer):
        self.model().addItem(layer)


def test():
    app = QtWidgets.QApplication(sys.argv)
    data = TreeList()
    data._items = ['one', 'two']
    sys.excepthook = sys.__excepthook__
    tree_view = StackTreeView(data)
    tree_view.show()
    tree_view.addItem('three')
    tree_view.addItem('four')
    sys.exit(app.exec_())


if __name__ == '__main__':
    test()

答案 1 :(得分:1)

import glob

path = "path/to/dir/*.csv"

for fname in glob.glob(path):
    print(fname)
    with open((fname), "w") as f:
        newText = f.read().replace('|', ',').replace(' ', '')
        f.write(newText)
        f.close()

答案 2 :(得分:0)

使用Pandas库读取csv文件,并将其值替换为预期的文件。

df['range'] = df['range'].str.replace(',','-')

range是列名。 并按照以下步骤保存

df.to_csv(file_name, sep=',')

或不使用库

with open(resource,'rb') as f, open("output.txt", "a+") as outputfile:
for line in f:
    line = line.replace(' ', '-')
    outputfile.write(line)