python实现读取文件夹中所有.csv文件第6行第B,F,J,N,R,V列和第13行第B-P列和第20行第B-P列数据,并输入到一个csv中。将读取到的第一个CSV文件中数第6行第B,F,J,N,R,V列数据输入到csv中第3行第D-I列,读取到的第13行第B-P列列数据输入到csv中第3行第N-AB列,读取到的第20行第B-P列数据输入到到csv中第3行第AG-AZ列,以此类推,后续csv文件写入到下一行中相应位置
时间: 2025-07-21 22:53:52 浏览: 0
<think>我们需要读取一个文件夹中的所有CSV文件,然后从每个CSV文件中提取特定位置的数据(第6行、第13行、第20行的特定列),并将这些数据按照指定的位置写入到一个新的CSV文件中。
步骤:
1. 遍历指定文件夹中的所有CSV文件。
2. 对于每个CSV文件:
a. 读取第6行(索引为5,因为行索引从0开始),并提取第B,F,J,N,R,V列(即列索引1,5,9,13,17,21,因为A列是0,B列是1,以此类推)。
b. 读取第13行(索引为12),并提取第B到第P列(即列索引1到15,注意:B是1,P是15,因为P是第16个字母,但索引从0开始,所以列索引1到15,包含1和15)。
c. 读取第20行(索引为19),并提取第B到第P列(同样列索引1到15)。
3. 将提取的数据按照以下位置写入到输出CSV文件的一行中:
- 第一个CSV文件的数据写入到输出文件的第3行(索引2),后续文件依次写入下一行(即第4行、第5行等)。
- 第6行的6个数据(B,F,J,N,R,V列)写入到输出文件的第D-I列(即列索引3到8,因为D是3,I是8,共6列)。
- 第13行的15个数据(B-P列)写入到输出文件的第N-AB列。注意:N是13,AB是27(因为A是0,B是1,...,Z是25,AA是26,AB是27)。但是我们需要15列,所以从13(N)开始到27(AB)结束,即列索引13到27(共15列)。
- 第20行的15个数据(B-P列)写入到输出文件的第AG-AZ列。AG是32(A=0, G=6, 所以AG=0*26+6+26? 实际上,我们按列索引计算:A=0, B=1,..., Z=25, AA=26, AB=27, ..., AG=32(因为A(26)+6=32)),AZ是51(A=0, Z=25, 所以AZ=26+25=51?不对,实际上:AA=26, AB=27, ..., AZ=26+25=51)。我们需要15列,所以从32(AG)开始到46(因为32+15-1=46)?但是题目要求是AG到AZ,而AZ是51,所以列数不够?这里可能我计算有误。
重新计算列索引(0-based):
- 字母表示列:A=0, B=1, ..., Z=25, 然后AA=26, AB=27, ..., AZ=51(因为26个字母,Z是25,AA=26,AZ=26+25=51? 实际上,AA是第27列,索引为26;AZ是第52列,索引为51)。
- 题目要求写入到AG-AZ列,AG是第33列(索引32),AZ是第52列(索引51)。所以从32到51有20列,但我们需要15列。所以我们可以从AG(32)开始,写入15列,即到32+14=46(列索引46)。但是题目要求写到AZ,可能是要求我们连续写入15列,从AG开始,但题目写的是AG-AZ,而AZ是51,这中间有20列(51-32+1=20列)。所以这里可能是题目描述有误,或者我们理解有误。
根据题目要求,我们只需要15列,所以我们应该从AG(32)开始,连续写入15列,即到列索引46(32+14)。但是题目要求是AG到AZ,而AZ是51,这显然超过了15列。因此,我怀疑题目中的“AZ”可能是笔误,应该是“AU”之类的?但题目明确写了“AG-AZ”。
为了明确,我们按照以下方式理解:
题目要求:第20行B-P列的数据写入到输出文件的第3行(第一个文件)的AG-AZ列。但是AG-AZ列有20列(32到51),而数据只有15列,所以我们需要将15列数据放入AG开始的连续15列,即AG到AU(因为AG=32, AU=32+14=46,即AU列,但题目要求AZ,所以这里我们按照题目要求的位置,从AG开始,写入15列,占据AG到AU(32到46)的位置,而AV到AZ(47到51)则留空?这显然不合理。
重新审视题目:题目要求“第20行第B-P列数据输入到到csv中第3行第AG-AZ列”,但AG-AZ列有20列(从32到51),而数据只有15列。所以这里可能是一个错误。或者,题目本意是写入到AG列开始的连续15列,但列范围写成了AG-AZ(可能是为了表示从AG开始,但结束列写错了)。
由于题目描述存在歧义,我决定按照以下方式处理:
我们只写入15列,从AG(32)开始,到46(即AU)结束。因为这样刚好15列。而题目中写的是AG-AZ,我们理解为从AG开始,但实际写入15列,结束位置是AU(46)。这样,输出文件的一行中,从AG到AZ(32到51)我们只用了前15列(32到46),后面的47到51留空。
但是,题目要求是“第AG-AZ列”,而AZ是51,所以我们不能留空,而是应该将15列数据写入到AG到AZ的前15列(AG到AU),然后后面的5列(AV到AZ)保持为空?这样可能不符合要求。
另一种可能是题目要求将15列数据重复写入?但题目没有说明。
考虑到问题的描述,我们按照最可能的需求:将15列数据写入从AG列开始连续15列,即列索引32到46(包括32和46)。这样,我们写入的位置就是AG到AU(因为AG是32,AU是46,共15列)。
因此,写入位置如下:
- 第一个部分:第6行的6个数据 -> 输出行中列索引3到8(D-I列)
- 第二部分:第13行的15个数据 -> 输出行中列索引13到27(N到AB列,因为N=13,AB=27,13+14=27,共15列)
- 第三部分:第20行的15个数据 -> 输出行中列索引32到46(AG到AU列)
4. 对于后续的CSV文件,我们依次写入输出文件的下一行,位置同上(即每个文件对应输出文件的一行)。
5. 注意:如果某个CSV文件没有6行、13行或20行,或者某行没有足够的列,我们需要处理异常(这里我们简单跳过或填充空值,但题目未说明,我们假设所有CSV文件都有足够的行和列)。
6. 我们将输出文件命名为`output.csv`。
实现:
我们将使用Python的`csv`模块来读取和写入CSV文件。
步骤:
- 导入csv和os模块。
- 定义输入文件夹路径和输出文件路径。
- 获取输入文件夹中所有的CSV文件(按文件名排序?题目未要求,我们按任意顺序,但通常按文件名排序)。
- 创建输出文件,并初始化一个写入器。
- 对于每个输入CSV文件,打开它并读取需要的行和列。
- 构造一个列表,长度应该是3+15+15=33?不对,输出行总列数应该是从D到AU(3到46)?但中间有间隔。实际上,我们只需要在指定的列位置写入数据,其他位置留空。所以输出行应该有47列(0到46)?因为最大列索引是46。
但是,我们输出行需要包含从0到46列(共47列)?因为我们要写入的位置最大列索引是46。但是,我们写入的位置是离散的:3-8, 13-27, 32-46。所以我们需要创建一个长度为47(索引0到46)的列表,并将提取的数据放入对应的索引位置,其他位置为空字符串。
另一种做法:我们创建一个长度为47的列表(初始化为空字符串),然后:
将第6行的6个数据放入索引3到8(共6个位置)
将第13行的15个数据放入索引13到27(共15个位置)
将第20行的15个数据放入索引32到46(共15个位置)
然后,将这个列表作为一行写入输出文件。
注意:第一个文件写入输出文件的第3行(索引2),第二个文件写入第4行(索引3),以此类推。输出文件的前两行(索引0和1)为空?或者我们需要保留?题目没有说明,我们假设从第3行开始写,前两行留空。
但是,题目要求第一个CSV文件的数据写入到输出文件的第3行,那么前两行应该是空行?或者我们不需要空行,直接第一行就是第一个文件的数据?题目说“输入到csv中第3行”,所以第1行和第2行应该是空行。因此,我们在写入第一个文件的数据之前,先写入两个空行(或者两个空列表,但空列表会导致写入空行吗?这取决于csv写入器)。
我们可以这样:先创建一个空列表,长度为47,全部填充空字符串。然后对于每个文件,我们创建一个这样的列表,填充数据,然后写入输出文件的一行。但是第一个文件应该写入在第3行,所以我们在写入之前,先写入两个空行(即两个包含47个空字符串的列表?或者两个空列表?但空列表会被写入成空行吗?)
实际上,csv文件的行数是由我们写入的行数决定的。我们可以:
先写入两行空行(即两个空列表,但每个空列表的长度应该是47,这样每行有47个空单元格?)或者我们写入两行,每行是一个包含47个空字符串的列表。
但是,如果输出文件需要包含标题行呢?题目没有要求,所以我们可以不写标题。
因此,步骤:
1. 打开输出文件,创建csv写入器。
2. 先写入两行空行(每行47个空字符串)?或者我们也可以不写,直接开始从第3行(即第三行)写数据。因为第一个文件的数据写入第3行,那么前两行就是空的。我们可以在写入第一个文件的数据之前,先写入两行空行(每行47列)。
但是,我们也可以不写前两行,直接让第一个文件的数据在第三行(即写入时,我们写入两行空行,然后写入第一个文件的数据,然后第二个文件的数据,等等)。或者,我们直接写入第一个文件的数据到第三行,那么前两行就是缺失的,这样在Excel中打开,第三行就是第一行数据?所以我们需要在输出文件中,第一行和第二行是空行,第三行开始是数据。
因此,我们可以在循环之前,先写入两个空行(每行47个空字符串)。
但是,我们也可以不这样做,而是让第一个文件的数据写入到第三行(即行索引2),那么我们在写入数据行之前,先写入两个空行。
具体步骤:
- 创建输出文件,写入两个空行(每行47个空字符串)?但是47个空字符串的列表。
- 遍历每个CSV文件,对于每个文件,读取数据,构造一个47个元素的列表(初始化为空字符串),然后将提取的数据放到对应的索引位置。
- 将该列表写入输出文件。
注意:列索引位置:
第一部分:第6行提取的6个数据,放在输出行列表的[3,4,5,6,7,8](索引3到8)
第二部分:第13行提取的15个数据,放在[13,14,...,27](索引13到27,共15个位置)
第三部分:第20行提取的15个数据,放在[32,33,...,46](索引32到46,共15个位置)
代码实现:
假设输入文件夹为'input_folder',输出文件为'output.csv'
注意:读取CSV文件时,我们使用csv.reader,并且假设所有CSV文件都是逗号分隔,并且没有特殊编码(如UTF-8)。
由于CSV文件可能很大,我们只读取需要的行(第6、13、20行),而不是全部读取。
如何读取特定行?我们可以逐行读取,然后只保留我们需要的行。
步骤:
with open(csv_file, 'r', encoding='utf-8') as f:
reader = csv.reader(f)
rows = []
for i, row in enumerate(reader):
if i == 5: # 第6行,索引5
row6 = row
elif i == 12: # 第13行
row13 = row
elif i == 19: # 第20行
row20 = row
# 如果已经超过20行,可以break
if i >= 19:
break
然后,从row6中提取列索引1,5,9,13,17,21(注意:如果该行没有这么多列,则取不到,我们使用try-except?或者判断列数。这里我们假设列数足够,否则会报错。为了安全,我们可以检查列数,如果不够则用空字符串填充。
提取列数据时,如果列索引超出该行的列数,则添加空字符串。
同样,对于row13和row20,提取列索引1到15(即索引1到15,如果列数不足,则用空字符串填充)。
然后,构造输出行(47个元素的列表,初始化为空字符串):
output_row = [''] * 47 # 索引0到46
然后,将提取的row6的6个数据放入output_row的[3:9](注意:切片是左闭右开,所以3:9对应索引3,4,5,6,7,8,共6个位置)
即:output_row[3:9] = extracted_row6 # 这里extracted_row6是一个包含6个元素的列表
同样,将row13的15个数据放入output_row[13:28](因为13:28是索引13到27)
output_row[13:28] = extracted_row13
将row20的15个数据放入output_row[32:47](索引32到46,因为32:47是32到46)
output_row[32:47] = extracted_row20
然后,将output_row写入输出文件。
注意:每个文件处理一次,写入一行。
代码结构:
步骤:
1. 设置输入文件夹和输出文件路径。
2. 获取输入文件夹下所有以.csv结尾的文件。
3. 打开输出文件,创建csv.writer。
4. 先写入两个空行(每行47个空字符串)?但是注意,我们写入空行时,需要写入一个包含47个空字符串的列表,写两次。
5. 遍历每个CSV文件:
读取该文件,获取第6行、第13行、第20行(行索引5,12,19)
如果某一行不存在(比如文件行数不足),则用空列表代替(但后面提取列时会用空字符串填充)。
提取指定列的数据(注意处理列数不足的情况)
构造一个长度为47的列表,初始化为空字符串。
将提取的6个数据放入索引3到8(3:9)
将提取的15个数据(第13行)放入索引13到27(13:28)
将提取的15个数据(第20行)放入索引32到46(32:47)
将该列表写入输出文件。
6. 关闭文件。
注意:如果文件很多,要注意及时关闭文件。
下面我们写代码:</think>以下是Python解决方案,用于读取文件夹中所有CSV文件的指定行列数据,并按特定格式输出到新的CSV文件中:
```python
import os
import csv
from pathlib import Path
def extract_data_from_csv(csv_path):
"""从CSV文件中提取第6/13/20行的指定列数据"""
with open(csv_path, 'r', encoding='utf-8-sig') as f:
reader = csv.reader(f)
rows = list(reader)
# 获取指定行数据(行索引从0开始)
row6 = rows[5] if len(rows) > 5 else [] # 第6行
row13 = rows[12] if len(rows) > 12 else [] # 第13行
row20 = rows[19] if len(rows) > 19 else [] # 第20行
# 定义列索引映射(A=0, B=1,...)
cols_row6 = [1, 5, 9, 13, 17, 21] # B,F,J,N,R,V列
cols_row13_20 = list(range(1, 16)) # B-P列(索引1-15)
# 提取数据(处理列不存在的情况)
data_row6 = [row6[i] if i < len(row6) else '' for i in cols_row6]
data_row13 = [row13[i] if i < len(row13) else '' for i in cols_row13_20]
data_row20 = [row20[i] if i < len(row20) else '' for i in cols_row13_20]
return data_row6, data_row13, data_row20
def process_folder(input_folder, output_file):
"""处理文件夹中的所有CSV文件并输出结果"""
csv_files = sorted(Path(input_folder).glob('*.csv'))
output_rows = []
# 添加空的前两行(占位)
output_rows.append([''] * 52) # 0-51列
output_rows.append([''] * 52)
for csv_file in csv_files:
# 提取数据
data6, data13, data20 = extract_data_from_csv(csv_file)
# 创建新行(52列,索引0-51对应A-AZ)
new_row = [''] * 52
# 填充数据到指定位置(列索引从0开始)
# D-I列(索引3-8)
if len(data6) == 6:
new_row[3:9] = data6
# N-AB列(索引13-27)
if len(data13) == 15:
new_row[13:28] = data13
# AG-AU列(索引32-46,注意AZ是51但只需15列)
if len(data20) == 15:
new_row[32:47] = data20 # AG(32)到AU(46)
output_rows.append(new_row)
# 写入输出文件
with open(output_file, 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerows(output_rows)
# 使用示例
if __name__ == "__main__":
input_folder = 'path/to/your/csv_folder' # 替换为实际路径
output_file = 'output.csv'
process_folder(input_folder, output_file)
print(f"处理完成!结果已保存到: {output_file}")
```
### 代码解释:
1. **列索引计算**:
- B列 = 索引1(A=0, B=1)
- D列 = 索引3, I列=索引8(D-I列对应索引3-8)
- N列=索引13, AB列=索引27(N-AB列对应索引13-27)
- AG列=索引32(A=0, G=6 → AA=26, AG=26+6=32)
- AU列=索引46(U=20 → AU=26+20=46)
2. **核心函数**:
- `extract_data_from_csv()`:读取CSV文件并提取特定行列数据
- `process_folder()`:遍历文件夹,整合数据到输出文件
3. **数据结构**:
- 输出CSV每行52列(索引0-51对应A-AZ列)
- 前两行为空行(占位)
- 从第3行开始填充数据(行索引2)
4. **关键操作**:
- 使用列表切片精准定位数据位置(如`new_row[3:9] = data6`)
- 自动处理文件/行列缺失情况
- 按文件名排序处理(`sorted()`)
### 注意事项:
1. 列索引从0开始计算(A=0, B=1...)
2. 输出文件前两行为空行
3. AG-AZ列实际使用AG-AU(32-46)共15列
4. 支持UTF-8编码(含BOM处理)
阅读全文
相关推荐


















