Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除同一目录中多个CSV文件的前两列和最后一列_Python_Shell_Csv - Fatal编程技术网

Python 删除同一目录中多个CSV文件的前两列和最后一列

Python 删除同一目录中多个CSV文件的前两列和最后一列,python,shell,csv,Python,Shell,Csv,我想知道从具有相同列结构的多个CSV文件中删除前两列和最后一列的最佳方法是什么 我试过使用awk和pandas,但它似乎只给了我一个选项,可以同时从一个input.csv文件中删除列并将其保存为output.csv。如何在不创建output.csv但覆盖现有文件的情况下删除多个文件中的第1、2、7列 我的CSV文件如下所示,其中Col1、Col2、Col7是完全空的(包括列标题) 和期望输出: Col3 , Col4 , Col5 , Col6 some_data,som

我想知道从具有相同列结构的多个CSV文件中删除前两列和最后一列的最佳方法是什么

我试过使用awk和pandas,但它似乎只给了我一个选项,可以同时从一个input.csv文件中删除列并将其保存为output.csv。如何在不创建output.csv但覆盖现有文件的情况下删除多个文件中的第1、2、7列

我的CSV文件如下所示,其中Col1、Col2、Col7是完全空的(包括列标题)

和期望输出:

  Col3   ,  Col4   ,  Col5   ,   Col6
some_data,some_data,some_data,some_data
some_data,some_data,some_data,some_data
some_data,some_data,some_data,some_data
我的代码到目前为止

import pandas as pd
import os
import fileinput
from dateutil import parser
# specifying directory and determining files for my loop 
path = r'/path/to/my/files'
files = [os.path.join(path,data_file) for data_file in sorted(os.listdir(path))]
#trying to read each csv file separately and delete columns from it
df = pd.read_csv(files)
# specifying columns to delete
first_column = df.columns[0]
second_column = df.columns[1]
last_column = df.columns[7]
# Delete my columns
df = df.drop([first_column, second_column, last_column], axis=1)
# trying to overwrite existing files after column removal instead of creating new files i.e. output.csv
df.to_csv(files, index=False)

这确实起到了作用

如果不创建临时文件不是一项严格的要求(实际上是创建新文件),那么这就是oneliner

find /path/to/your/dir -name '*.csv' -exec sh -c 'cut -d, -f3-6 $0 > $0.new && mv $0.new $0' {} \;

你能给出一个精确的例子(最好是代码中最简单的例子)吗?熊猫非常适合这个问题,根据我的经验,hi@Mark在上面添加了我的代码。对于单个文件来说这很简单,但是我在将列删除应用于多个文件时遇到了很多困难。您需要遍历目录中的所有文件(使用
os.listdir()
创建列表),将此代码应用于每个文件file@Baobab1988,那么问题中的逗号在哪里?您能否显示输入文件和相应的所需输出的块,而不是不带逗号的解释?块不需要来自实际文件,好的,但它需要代表它。您首先编写了一个CSV文件,然后发布了一个没有逗号的输入/输出示例。这对读者没有帮助。多个文件?当然是循环。你自己的答案是错误的。实际上,此解决方案将保留最后一个逗号,因为您要从3到7取列,而您明确表示要删除列1、2和7。此外,您正在创建一个新文件,而在您的问题中,您没有创建output.csv,而是显式编写了现有文件。
cd /path/to/my/file

for file in *.csv
do
cut -d, -f3,4,5,6,7 "$file" > "new_$file"
done
find /path/to/your/dir -name '*.csv' -exec sh -c 'cut -d, -f3-6 $0 > $0.new && mv $0.new $0' {} \;