Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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读取文件头和分隔符_Python_Csv_Delimiter - Fatal编程技术网

使用Python读取文件头和分隔符

使用Python读取文件头和分隔符,python,csv,delimiter,Python,Csv,Delimiter,我正在读取给定文件夹中的所有文件(包含Dir、Sub Dir和.csv、.txt.类型的文件) 我需要以以下格式将以下信息输入到输出文件中: 文件位置、文件名、分隔符、列 (单元格中需要的所有列由分隔符分隔) 我正在使用下面的脚本,除了分隔符之外,它工作得很好。我尝试过使用csv.sniffer,但它不起作用 import sys,os,csv ofilew = open('D:\OutputFile/Columns_Info.csv', 'w') ofile = open('D:\Outp

我正在读取给定文件夹中的所有文件(包含Dir、Sub Dir和.csv、.txt.类型的文件)

我需要以以下格式将以下信息输入到输出文件中:

文件位置、文件名、分隔符、列
(单元格中需要的所有列由分隔符分隔)

我正在使用下面的脚本,除了分隔符之外,它工作得很好。我尝试过使用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的特性来尝试确定用于读取文件的正确方言。它还包含所使用的分隔符

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')

这将通过计算第一行中列数最多的分隔符来返回可能的分隔符。如果只找到一列,则返回
None
,表示未找到匹配的分隔符。相反,它可能会引发异常。

请添加更多关于哪些不起作用的详细信息。是的,
csv.sniffer
无疑是这里使用的最佳工具。什么不适用于csv.sniffer?请添加一个无法适用于
csv.sniffer
Hi Martin的文件示例,函数get_delimiter-是否可以使其通用于.csv或.dat或.txt等文件?我的意思是,如果它可以读取所有类型的文件并获取文件中使用的分隔符,您可以尝试将任何文件传递给它,例如
my.txt
。您可能会发现某些文件无法解析。我修改了它,如果所有匹配尝试只检测到1列,则返回
None