Python 拆下1000';从CSV中的列中选择分隔符?

Python 拆下1000';从CSV中的列中选择分隔符?,python,csv,Python,Csv,我有一个Python脚本,其中我导入了一个csv,它的逗号值超过1000。这些值是csv中的字符串。我需要从值中删除逗号,并在将字符串导入Python之前将其转换为csv中的四舍五入浮点 我已经尝试将所有新值添加到列表中,以使用csv.writer,但我还没有弄清楚如何让writer只替换列中带有逗号的值。以下是我目前掌握的情况: import csv RoomReport = r'path_to_csv' new_values_list = [] f = open(RoomReport,

我有一个Python脚本,其中我导入了一个csv,它的逗号值超过1000。这些值是csv中的字符串。我需要从值中删除逗号,并在将字符串导入Python之前将其转换为csv中的四舍五入浮点

我已经尝试将所有新值添加到列表中,以使用
csv.writer
,但我还没有弄清楚如何让writer只替换列中带有逗号的值。以下是我目前掌握的情况:

import csv

RoomReport = r'path_to_csv'
new_values_list = []

f = open(RoomReport, "r")
reader = csv.reader(f)
writer = csv.writer(f)

for row in reader:
     useable_area = row[7]

     if "," in useable_area:
         useable_area_no_comma = useable_area.replace(",","")
         useable_area_rounded = int(round(float(useable_area_no_comma)))
         new_values_list.append(useable_area_rounded)


f.close()

也许是这样的

import re
from sys import stdout

isnum = re.compile('^[0-9, ]+$')
non = re.compile('[, ]')

fd = StringIO()
out = csv.writer(fd)
out.writerow(['foo','1,000,000',19])
out.writerow(['bar','1,234,567',20])

fd.seek(0)
inp = csv.reader(fd)
out = csv.writer(stdout)
for row in inp:
    for i, x in enumerate(row):
        if isnum.match(x):
            row[i] = float(non.sub('', x))
    out.writerow(row)

正如我在评论中提到的,只有当输入csv文件的格式允许数字中的逗号与每个数字之间的逗号区分时,才能执行此操作

下面是一个可以实现的方法示例(引用所有值):

“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7123.6”、“8”、“9”
"0","1","2","3","4","5","6","1,000","8","9"
"0","1","2","3","4","5","6","20,000","8","9"
这里的代码可以满足您的需要。它使用
locale.atof
函数简化数字清理:

import csv
import locale

# Set local to someplace that uses a comma for the thousands separator.
locale.setlocale(locale.LC_ALL, 'English_US.1252')

RoomReport = r'RoomReport.csv'
cleaned_report = r'RoomReport_cleaned.csv'
new_values_list = []

with open(RoomReport, "r", newline='') as inp:
    for row in csv.reader(inp):
        if "," in row[7]:
            row[7] = int(round(locale.atof(row[7])))

        new_values_list.append(row)

# Create cleaned-up output file.
with open(cleaned_report, "w", newline='') as outp:
    csv.writer(outp, quoting=csv.QUOTE_ALL).writerows(new_values_list)
它从示例输入创建的
RoomReport\u cleaned.csv
将包含以下内容:

“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7124”、“8”、“9”
"0","1","2","3","4","5","6","1000","8","9"
"0","1","2","3","4","5","6","20000","8","9"

请注意,由于输出中的值不再嵌入逗号,因此不再需要引用所有字段,因此可以通过指定
csv来省略not?或分号(,或;)不,一列中超过1000的数字有类似于1089的逗号。我需要1089。在导入csv并将其连接到Python脚本中的另一个表之前,我需要在csv中对此进行更改?如果是逗号,那么就不可能知道哪些是数字大于1000的列的一部分,哪些逗号分隔这些数字。请提问并显示输入文件的几行内容。如果数字周围有引号,这个问题是可以避免的。啊,好的。我知道你得到了什么谢谢。最简单的解决方案是首先将字段格式化为浮点数。比尔:很明显,如果输入csv的格式不同,问题就不存在了,但你从来没有在你的问题中提到这一点,这让我想知道你为什么要费心问这个问题……我真的不知道这是否可能。我对Tririga一无所知,也不知道它是如何输出报告的。csv来自不同的部门。我可以很容易地在Excel中重新格式化字段,但我需要这个过程完全自动化。比尔:我明白了……在这种情况下,我的答案(也许还有一个或多个其他答案)将以自动化的方式满足您的需要。我建议您阅读我能够通过将csv转换为地理数据库表(这是一个GIS过程)并重新格式化字段来解决这个问题。