如何使用python将.dat转换为.csv?

时间:2016-04-25 15:34:45

标签: python export-to-csv

我有一个file.dat,如下所示:

id       | user_id | venue_id | latitude  | longitude | created_at

---------+---------+----------+-----------+-----------+-----------------

984301   |2041916  |5222      |           |           |2012-04-21 17:39:01

984222   |15824    |5222      |38.8951118 |-77.0363658|2012-04-21 17:43:47

984315   |1764391  |5222      |           |           |2012-04-21 17:37:18

984234   |44652    |5222      |33.800745  |-84.41052  | 2012-04-21 17:43:43

我需要获取包含已删除的空纬度和经度行的csv文件,例如:

id,user_id,venue_id,latitude,longitude,created_at

984222,15824,5222,38.8951118,-77.0363658,2012-04-21T17:43:47

984234,44652,5222,33.800745,-84.41052,2012-04-21T17:43:43

984291,105054,5222,45.5234515,-122.6762071,2012-04-21T17:39:22

我尝试使用下一代码:

with open('file.dat', 'r') as input_file:
    lines = input_file.readlines()
    newLines = []
    for line in lines:
        newLine = line.strip('|').split()
        newLines.append(newLine)

with open('file.csv', 'w') as output_file:
    file_writer = csv.writer(output_file)
    file_writer.writerows(newLines)

但是我得到一个带有“|”的csv文件符号和空纬度/经度行。 哪里出错? 一般来说,我需要在DateFrame中使用生成的csv文件,所以可能有一些方法可以减少操作次数。

8 个答案:

答案 0 :(得分:7)

str.strip()从字符串中删除前导和尾随字符 您想要在"|"上拆分行,然后删除结果列表中的每个元素:

import csv

with open('file.dat') as dat_file, open('file.csv', 'w') as csv_file:
    csv_writer = csv.writer(csv_file)

    for line in dat_file:
        row = [field.strip() for field in line.split('|')]
        if len(row) == 6 and row[3] and row[4]:
            csv_writer.writerow(row)

答案 1 :(得分:2)

我使用了标准的python功能,没有预处理数据。我从先前的答案之一中得到了一个想法,并对其进行了改进。如果数据标题包含空格(通常是CSV格式的情况),我们应该自己确定列名称,并跳过包含标题的第1行。 之后,我们只能按特定列删除NaN值。

data = pd.read_csv("checkins.dat", sep='|', header=None, skiprows=1,
                   low_memory = False, skipinitialspace=True,
                   names=['id','user_id','venue_id','latitude','longitude','created_at'])
data.dropna(subset=['latitude', 'longitude'], inplace = True)

答案 2 :(得分:1)

使用不带参数的split()将导致在空格后分割 示例"test1 test2".split()会产生["test1", "test2"]

相反,试试这个:

newLine = line.split("|")

答案 3 :(得分:1)

也许最好使用map()函数而不是列表推导,因为它必须更快地工作。使用csv模块也可以轻松编写csv文件。

import csv
with open('file.dat', 'r') as fin:
with open('file.csv', 'w') as fout:
    for line in fin:
        newline = map(str.strip, line.split('|'))
        if len(newline) == 6 and newline[3] and newline[4]:
            csv.writer(fout).writerow(newline)

答案 4 :(得分:1)

使用此:

data = pd.read_csv('file.dat', sep='|', header=0, skipinitialspace=True)
data.dropna(inplace=True)

答案 5 :(得分:1)

with open("filename.dat") as f:
    with open("filename.csv", "w") as f1:
        for line in f:
            f1.write(line)

这可用于将.dat文件转换为.csv文件

答案 6 :(得分:0)

结合先前的答案,我为 Python 2.7 编写了代码:

import csv

lat_index = 3
lon_index = 4
fields_num = 6
csv_counter = 0

with open("checkins.dat") as dat_file:
    with open("checkins.csv", "w") as csv_file:
        csv_writer = csv.writer(csv_file)
        for dat_line in dat_file:
            new_line = map(str.strip, dat_line.split('|'))
            if len(new_line) == fields_num and new_line[lat_index] and new_line[lon_index]:
                csv_writer.writerow(new_line)
                csv_counter += 1

print("Done. Total rows written: {:,}".format(csv_counter))

答案 7 :(得分:0)

这对我有用:

data = pd.read_csv('file.dat',sep='::',names=list_for_names_of_columns)