使用 Python 读取文件头和分隔符
Read File headers and delimiters using Python
我正在读取给定文件夹中的所有文件(包含目录、子目录和 .csv、.txt .. 类型的文件)
我需要将以下信息放入格式如下的输出文件中:
FileLocation, FileName, Delimiter, Columns
(单元格中需要的所有列由分隔符分隔)
我正在使用以下脚本,除了分隔符外,它工作正常。我试过使用 csv.sniffer 但它不起作用。
import sys,os,csv
ofilew = open('D:\OutputFile/Columns_Info.csv', 'w')
ofile = open('D:\OutputFile/Columns_Info.csv', 'a')
root = 'D:\UnZipFiles'
path = os.path.join(root)
columninfo = 'FolderLocation, FileName, Delimiter, Columns' + '\n'
ofilew.write(columninfo)
for r,d,f in os.walk(path):
for file in f:
fullfilepath = os.path.join(r,file)
with open(fullfilepath,'r') as f:
columninfo = f.readline()
columninfo = columninfo.replace(",", ";")
output = file +','+ columninfo
outputfinal = r + ',' + output
ofile.write(outputfinal)
以下方法应该适合您,它使用 Python 的 csv.sniffer
功能来尝试确定用于读取文件的正确方言。这也包含使用的分隔符。
import os, csv
header_output = ['FolderLocation', 'FileName', 'Delimiter', 'Columns']
path = r'D:\UnZipFiles'
with open(r'D:\OutputFile\Columns_Info.csv', 'wb') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(header_output)
for root, folders, files in os.walk(path):
for file in files:
full_file_path = os.path.join(root, file)
with open(full_file_path, 'rb') as f_input:
try:
dialect = csv.Sniffer().sniff(f_input.read(1024))
f_input.seek(0)
csv_input = csv.reader(f_input, dialect)
header_input = next(csv_input)
csv_output.writerow([root, file, dialect.delimiter] + header_input)
except csv.Error as e:
print "{} - could not determine the delimiter".format(file)
作为 csv.sniffer
的替代品,您可以设计自己的,但 Python 比这个更强大:
def get_delimiter(file_name):
cols_found = []
for delim in [',', ';', '|', '\t']:
with open(file_name, 'rb') as f_in:
cols_found.append([len(next(csv.reader(f_in, delimiter=delim))), delim])
if cols_found[-1][0] > 1:
return sorted(cols_found)[-1][1]
else:
return None
print get_delimiter('my.csv')
这 returns 一个可能的分隔符,通过计算哪个分隔符导致第一行中的列数最多。如果只找到一列,则 returns None
表示没有找到匹配的分隔符。它可以改为引发异常。
我正在读取给定文件夹中的所有文件(包含目录、子目录和 .csv、.txt .. 类型的文件)
我需要将以下信息放入格式如下的输出文件中:
FileLocation, FileName, Delimiter, Columns
(单元格中需要的所有列由分隔符分隔)
我正在使用以下脚本,除了分隔符外,它工作正常。我试过使用 csv.sniffer 但它不起作用。
import sys,os,csv
ofilew = open('D:\OutputFile/Columns_Info.csv', 'w')
ofile = open('D:\OutputFile/Columns_Info.csv', 'a')
root = 'D:\UnZipFiles'
path = os.path.join(root)
columninfo = 'FolderLocation, FileName, Delimiter, Columns' + '\n'
ofilew.write(columninfo)
for r,d,f in os.walk(path):
for file in f:
fullfilepath = os.path.join(r,file)
with open(fullfilepath,'r') as f:
columninfo = f.readline()
columninfo = columninfo.replace(",", ";")
output = file +','+ columninfo
outputfinal = r + ',' + output
ofile.write(outputfinal)
以下方法应该适合您,它使用 Python 的 csv.sniffer
功能来尝试确定用于读取文件的正确方言。这也包含使用的分隔符。
import os, csv
header_output = ['FolderLocation', 'FileName', 'Delimiter', 'Columns']
path = r'D:\UnZipFiles'
with open(r'D:\OutputFile\Columns_Info.csv', 'wb') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(header_output)
for root, folders, files in os.walk(path):
for file in files:
full_file_path = os.path.join(root, file)
with open(full_file_path, 'rb') as f_input:
try:
dialect = csv.Sniffer().sniff(f_input.read(1024))
f_input.seek(0)
csv_input = csv.reader(f_input, dialect)
header_input = next(csv_input)
csv_output.writerow([root, file, dialect.delimiter] + header_input)
except csv.Error as e:
print "{} - could not determine the delimiter".format(file)
作为 csv.sniffer
的替代品,您可以设计自己的,但 Python 比这个更强大:
def get_delimiter(file_name):
cols_found = []
for delim in [',', ';', '|', '\t']:
with open(file_name, 'rb') as f_in:
cols_found.append([len(next(csv.reader(f_in, delimiter=delim))), delim])
if cols_found[-1][0] > 1:
return sorted(cols_found)[-1][1]
else:
return None
print get_delimiter('my.csv')
这 returns 一个可能的分隔符,通过计算哪个分隔符导致第一行中的列数最多。如果只找到一列,则 returns None
表示没有找到匹配的分隔符。它可以改为引发异常。