web-dev-qa-db-fra.com

Comment fractionner une chaîne python sur les caractères d'une nouvelle ligne

Dans python3 dans Win7, j'ai lu une page Web dans une chaîne.

Je veux ensuite scinder la chaîne en une liste de caractères de nouvelle ligne.

Je ne peux pas entrer la nouvelle ligne dans mon code en tant qu'argument dans split (), car je reçois une erreur de syntaxe "EOL lors de l'analyse de littéral de chaîne".

Si je tape les caractères\et n, je reçois une erreur Unicode.

Y a-t-il un moyen de le faire?

8
user1067305

✨ Ligne de fractionnement en Python:

Avez-vous essayé d'utiliser la méthode str.splitlines() ?:

De la docs:

str.splitlines([keepends])

Retourne une liste des lignes dans la chaîne, coupant les limites de lignes . Les sauts de ligne ne sont pas inclus dans la liste résultante à moins que keepends soit égal à donné et vrai.

Par exemple:

>>> 'Line 1\n\nLine 3\rLine 4\r\n'.splitlines()
['Line 1', '', 'Line 3', 'Line 4']

>>> 'Line 1\n\nLine 3\rLine 4\r\n'.splitlines(True)
['Line 1\n', '\n', 'Line 3\r', 'Line 4\r\n']

???? Quels délimiteurs sont considérés?

Cette méthode utilise l'approche newlines universelle pour séparer des lignes.

La principale différence entre Python 2.X et Python 3.X réside dans le fait que le premier utilise l'approche de saut de ligne universelle pour séparer les lignes, de sorte que "\r", "\n" et "\r\n" sont considérés comme des limites de ligne pour les chaînes de 8 bits, tandis que le second utilise un sur-ensemble incluant :

  • \v ou \x0b: Line Tabulation (ajouté en Python 3.2).
  • \f ou \x0c: Form Feed (ajouté en Python 3.2).
  • \x1c: séparateur de fichiers.
  • \x1d: Séparateur de groupe.
  • \x1e: séparateur d'enregistrement.
  • \x85: ligne suivante (code de contrôle C1).
  • \u2028: séparateur de ligne.
  • \u2029: séparateur de paragraphe.

???? splitlines VS split:

Contrairement à str.split() quand une chaîne de délimitation sep est donnée, cette méthode renvoie une liste vide pour la chaîne vide et un saut de ligne terminal n'entraîne pas de ligne supplémentaire:

>>> ''.splitlines()
[]

>>> 'Line 1\n'.splitlines()
['Line 1']

Alors que str.split('\n') retourne:

>>> ''.split('\n')
['']

>>> 'Line 1\n'.split('\n')
['Line 1', '']

Suppression des espaces supplémentaires:

Si vous devez également supprimer d'autres espaces, comme les espaces, ignorés par str.splitlines(), vous pouvez utiliser str.splitlines() avec - str.strip() :

>>> [str.strip() for str in 'Line 1  \n  \nLine 3 \rLine 4 \r\n'.splitlines()]
['Line 1', '', 'Line 3', 'Line 4']

???? Supprimer les chaînes vides (''):

Enfin, si vous souhaitez filtrer les chaînes vides de la liste résultante, vous pouvez utiliser filter() :

>>> # Python 2.X:
>>> filter(bool, 'Line 1\n\nLine 3\rLine 4\r\n'.splitlines())
['Line 1', 'Line 3', 'Line 4']

>>> # Python 3.X:
>>> list(filter(bool, 'Line 1\n\nLine 3\rLine 4\r\n'.splitlines()))
['Line 1', 'Line 3', 'Line 4']

???? Commentaire supplémentaire concernant la question initiale:

Comme le suggère l'erreur suggérée par Burhan, le problème vient de l'imprimé. Une question connexe pourrait vous être utile: UnicodeEncodeError: le codec 'charmap' ne peut pas coder - mappages de caractères sur <undefined>, fonction d'impression

33
Danziger

a.txt

this is line 1
this is line 2

code:

Python 3.4.0 (default, Mar 20 2014, 22:43:40) 
[GCC 4.6.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> file = open('a.txt').read()
>>> file
>>> file.split('\n')
['this is line 1', 'this is line 2', '']

Je suis sous Linux, mais je suppose que vous utilisez simplement \r\n sous Windows et que cela fonctionnerait également

1
laike9m