python3文件处理txt或cs

2024-09-22 20:25:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件txt/csv文件,分隔符为“~”,每个值用分隔符分隔,但分隔符之间的值也有“\n”字符。我想要一个输出文件,每个值被放置在每个单元格,其中包括换行符以及。我该怎么做?你知道吗

我的文件如下所示:

1~2~3~4~5~6~7~8~9~10~11~12~13~14~15~16~17~18~19~20~21~22~23~24~25~26~27~28~29~30~31~32~33~34~35~36~37~38~39~40~
284913111067~284913111068~284913111069~284913111070~284913111071~284913111072~284913111073~284913111074~284913111075~284913111076~284913111077~284913111078~284913111079~284913111080~284913111081~284913111082~284913111083~284913111084~284913111085~284913111086~284913111087~284913111088~284913111089~284913111090~284913111091~284913111092~284913111093~284913111094~284913111095~284913111096~284913111097~284913111098~284913111099~284913111100~284913111101~284913111102~284913111103~284913111104~284913111105~284913111106~
MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~MSS~SA~SA~SA~SA~SA~SA~SA~SA~SA~SA~SA~SA~SA~SA~SA~
U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~NE~NE~NE~NE~NE~NE~NE~NE~U~NE~U~NE~U~U~U~
0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~
284913380481;284913380482;284913380483;284913380484~284913380485;284913380486;284913380487;284913380488~284913380489;284913380490;284913380491;284913380492~284913380493;284913380494;284913380495;284913380496~284913380497;284913380498;284913380499;284913380500~284913380501;284913380502;284913380503;284913380504~284913380505;284913380506;284913380507;284913380508~284913380509;284913380510;284913380511;284913380512~284913380513;284913380514;284913380515;284913380516~284913380517;284913380518;284913380519;284913380520~284913380521;284913380522;284913380523;284913380524~284913380525;284913380526;284913380527;284913380528~284913380529;284913380530;284913380531;284913380532~284913380533;284913380534;284913380535;284913380536~284913380537;284913380538;284913380539;284913380540~284913380541;284913380542;284913380543;284913380544~284913380545;284913380546;284913380547;284913380548~284913380549;284913380550;284913380551;284913380552~284913380553;284913380554;284913380555;284913380556~284913380557;284913380558;284913380559;284913380560~284913380561;284913380562;284913380563;284913380564~284913380565;284913380566;284913380567;284913380568~284913380569;284913380570;284913380571;284913380572~284913380573;284913380574;284913380575;284913380576~284913380577;284913380578;284913380579;284913380580~Not Applicable~Not Applicable~Not Applicable~Not Applicable~Not Applicable~Not Applicable~Not Applicable~Not Applicable~Not Applicable~Not Applicable~Not Applicable~Not Applicable~Not Applicable~Not Applicable~Not Applicable~
--~--~--~--~--~--~--~--~--~--~--~--~--~--~--~--~--~--~--~--~--~--~--~--~--~xbchbshfbjdzbuygeyrgjdzhzuihewu45hriuy78646213wsdcvbgdreser
bhbhgv

hbhdbfhzdxf   )_+)()*^

fddgfbduhygfdhxzxcvbnm


lkjhg
 gggffd bgdd fds aqwe rtyi opp,./'; []=-0987654321       



<>?":{}|+_)(*&^%$#@!


nhgdytsgfcusifu7fygtsygfyfrdfjhsd5e56
skjbftys
sfkndytfdtwsy6
trd
dgrdy
126;7';''',./';l[]]-=0

jhou8rdsj4nrzbwe4red
sb resyf
ASCVmnhgfstafdtg,./';[]=-0987654321<>?":{AASDFDFqeffrewrttg!@#$%^~--~--~--~

从上面的文件中可以看到,分隔符之间的值有换行符 我的输出应该是csv格式,每个值都在单个单元格中,例如:

1.....40
mss ...SA

Tags: 文件csvtxtsanot字符ne分隔符
3条回答

如果您的文件是这样的:

~hello
~this is an example
~i'm imagining what your file might be like
~i hope i'm right

那么这个代码应该起作用:

file=open("info.txt", "r")
values=file.read().split("~")
values.pop(0)

您只需向pandas的sep='~'方法提供.read_csv()(它将\n解释为适当字段的一部分)。假设您的数据文件如下('blahs.csv'):

# contents of 'blahs.csv':
h0~h1~h2
blah00~blah01~blah02\n
blah10~blah11~blah12\n
blah20~blah21~blah22\n

然后你就可以导入熊猫,像这样读入:

import pandas as pd
blah = pd.read_csv('blahs.csv', sep='~')

blah
##     h0      h1        h2
## blah00  blah01  blah02\n
## blah10  blah11  blah12\n
## blah20  blah21  blah22\n

(顺便说一句,熊猫将解释换行字符就像任何其他字符,除非你告诉它另外。有关详细信息,请参见official docs。)

您的文件不是CSV文件。每个字段都有一个尾随分隔符。假设第一行是标题,这意味着您有40字段。要解析它,您需要读取字符,直到找到40分隔符,然后在分隔符上拆分(然后跳过下一个换行符)。可以使用generator函数一次返回一行,如下所示:

import re
import csv

delimiter = '~'

def get_row():
    with open('input.csv', 'r') as f_input:
        delimiter_count = 0
        skip_newline = False
        row_chars = []

        for c in f_input.read():
            if skip_newline:
                if c == '\n':
                    skip_newline = False
            elif c == delimiter:
                delimiter_count += 1

                if delimiter_count == 40:
                    yield ''.join(row_chars).split(delimiter)
                    row_chars = []
                    delimiter_count = 0
                    skip_newline = True
                else:
                    row_chars.append(c)
            else:
                row_chars.append(c)

        yield ''.join(row_chars).split(delimiter)

rows = [row for row in get_row()]
df = pd.DataFrame(rows[1:], columns=rows[0]).fillna('')
df.to_csv('output.csv', index=False)

结果output.csv包含正确用逗号分隔的单元格,单元格包含用引号括起来的换行符。例如,它可以正确地加载到Excel中。你知道吗

这也可以通过使用多行正则表达式来实现。你知道吗

import re

with open('input.csv', 'r') as f_input:
    rows = re.findall('(([^\~]*\~){40}(\n|\Z))', f_input.read())
    rows = [row[0].rstrip('~\n').split('~') for row in rows]
    df = pd.DataFrame(rows[1:], columns=rows[0]).fillna('')
    df.to_csv('output.csv', index=False)

不过,由于最后一行只包含29分隔符,因此当前在文件中执行此操作将失败。如果在末尾添加十一个~字符,就可以了。你知道吗

相关问题 更多 >