3

我有一堆 CSV 文件。在其中一些中,缺失的数据由空单元格表示,但在另一些中,有一个句点。我想遍历所有文件,打开它们,删除单独出现的任何句点,然后保存并关闭文件。

我已经阅读了很多关于使用 re.sub() 进行全词搜索的其他问题。这就是我想要做的(删除 . 当它单独出现而不是 3.5 中的 . 时),但我无法为整个单词是特殊字符('. ')。另外,我担心在整个单词也可以通过制表符和换行符区分的情况下,这些答案可能会有所不同。也就是说, /b 是否适用于我的 CSV 文件案例?

更新:这是我在看到下面的帮助后写的一个函数。也许它对其他人有用。

import csv, re

def clean(infile, outfile, chars):

''' 
Open a file, remove all specified special characters used to represent missing data, and save.\n\n
infile:\tAn input file path\n
outfile:\tAn output file path\n
chars:\tA list of strings representing missing values to get rid of
'''

in_temp = open(infile)
out_temp = open(outfile, 'wb')

csvin = csv.reader(in_temp)
csvout = csv.writer(out_temp)
for row in csvin:
    row = re.split('\t', row[0])
    for colno, col in enumerate(row):
        for char in chars:
            if col.strip() == char:
                row[colno] = ''
    csvout.writerow(row)

in_temp.close()
out_temp.close()
4

3 回答 3

5

像这样的东西应该可以解决问题......这些数据不会碰巧来自SAS - IIRC,经常使用'。缺少数值。

import csv

with open('input.csv') as fin, open('output.csv', 'wb') as fout:
    csvin = csv.reader(fin)
    csvout = csv.writer(fout)
    for row in csvin:
        for colno, col in enumerate(row):
            if col.strip() == '.':
                row[colno] = ''
        csvout.writerow(row)
于 2012-07-18T17:26:23.790 回答
2

为什么不直接使用 csv 模块?

#!/usr/bin/env python

import csv

with open(somefile) as infile:
  r=csv.reader(infile)
  rows = []
  for row in csv:
    rows.append(['' if f == "." else f for f in row])
with open(newfile, 'w') as outfile:
  w=csv.writer(outfile)
  w.writelines(rows)
于 2012-07-18T17:26:09.900 回答
0

最安全的方法是使用 CSV 模块来处理文件,然后识别任何仅包含 的字段.,删除这些字段并将新的 CSV 文件写回磁盘。

一个脆弱的解决方法是搜索和替换一个没有被字母数字包围的点:\B\.\B是找到这些点的正则表达式。但这也可能会找到其他点,例如"...".

因此,要查找被逗号包围的点,您可以搜索(?<=,)\.(?=,).

于 2012-07-18T17:26:09.810 回答